##// 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
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
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
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
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
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
NO CONTENT: new file 100755
1 NO CONTENT: new file 100755
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
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
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
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
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
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
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
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
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
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
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
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
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
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,6 +1,6 b''
1 [bumpversion]
1 [bumpversion]
2 current_version = 4.17.4
2 current_version = 4.18.0
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
6
6
@@ -1,16 +1,17 b''
1 [run]
1 [run]
2
2
3 branch = True
3 branch = True
4
4
5 include =
5 include =
6 rhodecode/*
6 rhodecode/*
7
7
8 omit =
8 omit =
9 rhodecode/lib/dbmigrate/*
9 rhodecode/lib/dbmigrate/*
10 rhodecode/lib/paster_commands/*
10 rhodecode/lib/paster_commands/*
11 rhodecode/lib/_vendor/*
11
12
12 [report]
13 [report]
13
14
14 exclude_lines =
15 exclude_lines =
15 raise NotImplementedError
16 raise NotImplementedError
16
17
@@ -1,67 +1,68 b''
1 syntax: glob
1 syntax: glob
2 *.egg
2 *.egg
3 *.egg-info
3 *.egg-info
4 *.idea
4 *.idea
5 *.orig
5 *.orig
6 *.pyc
6 *.pyc
7 *.sqlite-journal
7 *.sqlite-journal
8 *.swp
8 *.swp
9 *.tox
9 *.tox
10 *.DS_Store*
10 *.DS_Store*
11 rhodecode/public/js/src/components/**/*.css
11 rhodecode/public/js/src/components/**/*.css
12
12
13 syntax: regexp
13 syntax: regexp
14
14
15 #.filename
15 #.filename
16 ^\.settings$
16 ^\.settings$
17 ^\.project$
17 ^\.project$
18 ^\.pydevproject$
18 ^\.pydevproject$
19 ^\.coverage$
19 ^\.coverage$
20 ^\.cache.*$
20 ^\.cache.*$
21 ^\.rhodecode$
21 ^\.rhodecode$
22
22
23 ^rcextensions
23 ^rcextensions
24 ^.dev
24 ^.dev
25 ^._dev
25 ^._dev
26 ^build/
26 ^build/
27 ^coverage\.xml$
27 ^coverage\.xml$
28 ^data$
28 ^data$
29 ^\.eggs/
29 ^\.eggs/
30 ^configs/data$
30 ^configs/data$
31 ^dev.ini$
31 ^dev.ini$
32 ^acceptance_tests/dev.*\.ini$
32 ^acceptance_tests/dev.*\.ini$
33 ^dist/
33 ^dist/
34 ^fabfile.py
34 ^fabfile.py
35 ^htmlcov
35 ^htmlcov
36 ^junit\.xml$
36 ^junit\.xml$
37 ^node_modules/
37 ^node_modules/
38 ^node_binaries/
38 ^node_binaries/
39 ^pylint.log$
39 ^pylint.log$
40 ^rcextensions/
40 ^rcextensions/
41 ^result$
41 ^result$
42 ^rhodecode/public/css/style.css$
42 ^rhodecode/public/css/style.css$
43 ^rhodecode/public/css/style-polymer.css$
43 ^rhodecode/public/css/style-polymer.css$
44 ^rhodecode/public/css/style-ipython.css$
44 ^rhodecode/public/css/style-ipython.css$
45 ^rhodecode/public/js/rhodecode-components.html$
45 ^rhodecode/public/js/rhodecode-components.html$
46 ^rhodecode/public/js/rhodecode-components.js$
46 ^rhodecode/public/js/rhodecode-components.js$
47 ^rhodecode/public/js/scripts.js$
47 ^rhodecode/public/js/scripts.js$
48 ^rhodecode/public/js/scripts.min.js$
48 ^rhodecode/public/js/src/components/root-styles.gen.html$
49 ^rhodecode/public/js/src/components/root-styles.gen.html$
49 ^rhodecode/public/js/vendors/webcomponentsjs/
50 ^rhodecode/public/js/vendors/webcomponentsjs/
50 ^rhodecode\.db$
51 ^rhodecode\.db$
51 ^rhodecode\.log$
52 ^rhodecode\.log$
52 ^rhodecode_dev\.log$
53 ^rhodecode_dev\.log$
53 ^test\.db$
54 ^test\.db$
54
55
55 # ac-tests
56 # ac-tests
56 ^acceptance_tests/\.cache.*$
57 ^acceptance_tests/\.cache.*$
57 ^acceptance_tests/externals
58 ^acceptance_tests/externals
58 ^acceptance_tests/ghostdriver.log$
59 ^acceptance_tests/ghostdriver.log$
59 ^acceptance_tests/local(_.+)?\.ini$
60 ^acceptance_tests/local(_.+)?\.ini$
60
61
61 # docs
62 # docs
62 ^docs/_build$
63 ^docs/_build$
63 ^docs/result$
64 ^docs/result$
64 ^docs-internal/_build$
65 ^docs-internal/_build$
65
66
66 # Cythonized things
67 # Cythonized things
67 ^rhodecode/.*\.(c|so)$
68 ^rhodecode/.*\.(c|so)$
@@ -1,33 +1,28 b''
1 [DEFAULT]
1 [DEFAULT]
2 done = false
2 done = false
3
3
4 [task:bump_version]
4 [task:bump_version]
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
9
8
10 [task:fixes_on_stable]
9 [task:fixes_on_stable]
11 done = true
12
10
13 [task:pip2nix_generated]
11 [task:pip2nix_generated]
14 done = true
15
12
16 [task:changelog_updated]
13 [task:changelog_updated]
17 done = true
18
14
19 [task:generate_api_docs]
15 [task:generate_api_docs]
20 done = true
16
17 [task:updated_translation]
21
18
22 [release]
19 [release]
23 state = prepared
20 state = in_progress
24 version = 4.17.4
21 version = 4.18.0
25
26 [task:updated_translation]
27
22
28 [task:generate_js_routes]
23 [task:generate_js_routes]
29
24
30 [task:updated_trial_license]
25 [task:updated_trial_license]
31
26
32 [task:generate_oss_licenses]
27 [task:generate_oss_licenses]
33
28
@@ -1,21 +1,22 b''
1 var gruntConfig = require('./grunt_config.json');
1 var gruntConfig = require('./grunt_config.json');
2 var webpackConfig = require('./webpack.config');
2 var webpackConfig = require('./webpack.config');
3 gruntConfig["webpack"] = {
3 gruntConfig["webpack"] = {
4 options: {
4 options: {
5 stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
5 stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
6 },
6 },
7 prod: webpackConfig,
7 prod: webpackConfig,
8 dev: Object.assign({ watch: false }, webpackConfig)
8 dev: Object.assign({ watch: false }, webpackConfig)
9 };
9 };
10
10
11 module.exports = function(grunt) {
11 module.exports = function(grunt) {
12 grunt.initConfig(gruntConfig);
12 grunt.initConfig(gruntConfig);
13
13
14 grunt.loadNpmTasks('grunt-contrib-less');
14 grunt.loadNpmTasks('grunt-contrib-less');
15 grunt.loadNpmTasks('grunt-contrib-concat');
15 grunt.loadNpmTasks('grunt-contrib-concat');
16 grunt.loadNpmTasks('grunt-contrib-uglify');
16 grunt.loadNpmTasks('grunt-contrib-watch');
17 grunt.loadNpmTasks('grunt-contrib-watch');
17 grunt.loadNpmTasks('grunt-contrib-jshint');
18 grunt.loadNpmTasks('grunt-contrib-jshint');
18 grunt.loadNpmTasks('grunt-contrib-copy');
19 grunt.loadNpmTasks('grunt-contrib-copy');
19 grunt.loadNpmTasks('grunt-webpack');
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 .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build generate-pkgs
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 NODE_PATH=./node_modules
4 NODE_PATH=./node_modules
5 WEBPACK=./node_binaries/webpack
5 WEBPACK=./node_binaries/webpack
6 GRUNT=./node_binaries/grunt
6 GRUNT=./node_binaries/grunt
7
7
8
8
9 clean:
9 clean:
10 make test-clean
10 make test-clean
11 find . -type f \( -iname '*.c' -o -iname '*.pyc' -o -iname '*.so' -o -iname '*.orig' \) -exec rm '{}' ';'
11 find . -type f \( -iname '*.c' -o -iname '*.pyc' -o -iname '*.so' -o -iname '*.orig' \) -exec rm '{}' ';'
12
12
13 test:
13 test:
14 make test-clean
14 make test-clean
15 make test-only
15 make test-only
16
16
17 test-clean:
17 test-clean:
18 rm -rf coverage.xml htmlcov junit.xml pylint.log result
18 rm -rf coverage.xml htmlcov junit.xml pylint.log result
19 find . -type d -name "__pycache__" -prune -exec rm -rf '{}' ';'
19 find . -type d -name "__pycache__" -prune -exec rm -rf '{}' ';'
20 find . -type f \( -iname '.coverage.*' \) -exec rm '{}' ';'
20
21
21 test-only:
22 test-only:
22 PYTHONHASHSEED=random \
23 PYTHONHASHSEED=random \
23 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
24 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
24 --cov-report=term-missing --cov-report=html \
25 --cov-report=term-missing --cov-report=html \
25 rhodecode
26 rhodecode
26
27
27 test-only-mysql:
28 test-only-mysql:
28 PYTHONHASHSEED=random \
29 PYTHONHASHSEED=random \
29 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
30 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
30 --cov-report=term-missing --cov-report=html \
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 rhodecode
33 rhodecode
33
34
34 test-only-postgres:
35 test-only-postgres:
35 PYTHONHASHSEED=random \
36 PYTHONHASHSEED=random \
36 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
37 py.test -x -vv -r xw -p no:sugar --cov=rhodecode \
37 --cov-report=term-missing --cov-report=html \
38 --cov-report=term-missing --cov-report=html \
38 --ini-config-override='{"app:main": {"sqlalchemy.db1.url": "postgresql://postgres:qweqwe@localhost/rhodecode_test"}}' \
39 --ini-config-override='{"app:main": {"sqlalchemy.db1.url": "postgresql://postgres:qweqwe@localhost/rhodecode_test"}}' \
39 rhodecode
40 rhodecode
40
41
41
42
42 docs:
43 docs:
43 (cd docs; nix-build default.nix -o result; make clean html)
44 (cd docs; nix-build default.nix -o result; make clean html)
44
45
45 docs-clean:
46 docs-clean:
46 (cd docs; make clean)
47 (cd docs; make clean)
47
48
48 docs-cleanup:
49 docs-cleanup:
49 (cd docs; make cleanup)
50 (cd docs; make cleanup)
50
51
51 web-build:
52 web-build:
52 NODE_PATH=$(NODE_PATH) $(GRUNT)
53 NODE_PATH=$(NODE_PATH) $(GRUNT)
53
54
54 generate-pkgs:
55 generate-pkgs:
55 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
56 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
56
57
57 generate-js-pkgs:
58 generate-js-pkgs:
58 rm -rf node_modules && \
59 rm -rf node_modules && \
59 nix-shell pkgs/shell-generate.nix --command "node2nix --input package.json -o pkgs/node-packages.nix -e pkgs/node-env.nix -c pkgs/node-default.nix -d --flatten --nodejs-8" && \
60 nix-shell pkgs/shell-generate.nix --command "node2nix --input package.json -o pkgs/node-packages.nix -e pkgs/node-env.nix -c pkgs/node-default.nix -d --flatten --nodejs-8" && \
60 sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix
61 sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix
61
62
62 generate-license-meta:
63 generate-license-meta:
63 nix-build pkgs/license-generate.nix -o result-license && \
64 nix-build pkgs/license-generate.nix -o result-license && \
64 cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json No newline at end of file
65 cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json
@@ -1,116 +1,121 b''
1 =========
1 =========
2 RhodeCode
2 RhodeCode
3 =========
3 =========
4
4
5 About
5 About
6 -----
6 -----
7
7
8 ``RhodeCode`` is a fast and powerful management tool for Mercurial_ and GIT_
8 ``RhodeCode`` is a fast and powerful source code management tool for
9 and Subversion_ with a built in push/pull server, full text search,
9 Mercurial_, GIT_ and Subversion_. It's main features are:
10 pull requests and powerful code-review system. It works on http/https, SSH and
10
11 has a few unique features like:
12
11
13 - plugable architecture from Pyramid web-framework.
12 - built in push/pull server
14 - advanced permission system with IP restrictions, inheritation, and user-groups.
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 - rich set of authentication plugins including LDAP, ActiveDirectory, SAML 2.0,
18 - rich set of authentication plugins including LDAP, ActiveDirectory, SAML 2.0,
16 Atlassian Crowd, Http-Headers, Pam, Token-Auth, OAuth.
19 Atlassian Crowd, Http-Headers, Pam, Token-Auth, OAuth.
17 - live code-review chat, and reviewer rules.
20 - live code-review chat, and reviewer rules.
18 - full web based file editing.
21 - full web based file editing.
19 - unified multi vcs support.
22 - unified multi vcs support.
20 - snippets (gist) system.
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 - integration with all 3rd party issue trackers.
26 - integration with all 3rd party issue trackers.
23
27
24
28
25 RhodeCode also provides rich API, and multiple event hooks so it's easy
29 RhodeCode also provides rich API, and multiple event hooks so it's easy
26 integrable with existing external systems.
30 integrable with existing external systems.
27
31
28 RhodeCode is similar in some respects to gitlab_, github_ or bitbucket_,
32 RhodeCode is similar in some respects to gitlab_, github_ or bitbucket_,
29 however RhodeCode can be run as standalone hosted application on your own server.
33 however RhodeCode can be run as standalone hosted application on your own server.
30 RhodeCode can be installed on \*nix or Windows systems.
34 RhodeCode can be installed on \*nix or Windows systems.
31
35
32 RhodeCode uses `PEP386 versioning <http://www.python.org/dev/peps/pep-0386/>`_
36 RhodeCode uses `PEP386 versioning <http://www.python.org/dev/peps/pep-0386/>`_
33
37
34 Installation
38 Installation
35 ------------
39 ------------
36 Please visit https://docs.rhodecode.com/RhodeCode-Control/tasks/install-cli.html
40 Please visit https://docs.rhodecode.com/RhodeCode-Control/tasks/install-cli.html
37 for more details
41 for more details
38
42
39
43
40 Source code
44 Source code
41 -----------
45 -----------
42
46
43 The latest sources can be obtained from official RhodeCode instance
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 Contributions
52 Contributions
48 -------------
53 -------------
49
54
50 RhodeCode is open-source; contributions are welcome!
55 RhodeCode is open-source; contributions are welcome!
51
56
52 Please see the contribution documentation inside of the docs folder, which is
57 Please see the contribution documentation inside of the docs folder, which is
53 also available at
58 also available at
54 https://docs.rhodecode.com/RhodeCode-Enterprise/contributing/contributing.html
59 https://docs.rhodecode.com/RhodeCode-Enterprise/contributing/contributing.html
55
60
56 For additional information about collaboration tools, our issue tracker,
61 For additional information about collaboration tools, our issue tracker,
57 licensing, and contribution credit, visit https://rhodecode.com/open-source
62 licensing, and contribution credit, visit https://rhodecode.com/open-source
58
63
59
64
60 RhodeCode Features
65 RhodeCode Features
61 ------------------
66 ------------------
62
67
63 Check out all features of RhodeCode at https://rhodecode.com/features
68 Check out all features of RhodeCode at https://rhodecode.com/features
64
69
65 License
70 License
66 -------
71 -------
67
72
68 ``RhodeCode`` is dual-licensed with AGPLv3 and commercial license.
73 ``RhodeCode`` is dual-licensed with AGPLv3 and commercial license.
69 Please see LICENSE.txt file for details.
74 Please see LICENSE.txt file for details.
70
75
71
76
72 Getting help
77 Getting help
73 ------------
78 ------------
74
79
75 Listed bellow are various support resources that should help.
80 Listed bellow are various support resources that should help.
76
81
77 .. note::
82 .. note::
78
83
79 Please try to read the documentation before posting any issues, especially
84 Please try to read the documentation before posting any issues, especially
80 the **troubleshooting section**
85 the **troubleshooting section**
81
86
82 - Official issue tracker `RhodeCode Issue tracker <https://issues.rhodecode.com>`_
87 - Official issue tracker `RhodeCode Issue tracker <https://issues.rhodecode.com>`_
83
88
84 - Official Slack Community Channel `RhodeCode Slack <https://rhodecode.com/join>`_
89 - Official Slack Community Channel `RhodeCode Slack <https://rhodecode.com/join>`_
85
90
86 - Search our community portal `Community portal <https://community.rhodecode.com>`_
91 - Search our community portal `Community portal <https://community.rhodecode.com>`_
87
92
88 - You can also follow RhodeCode on twitter **@RhodeCode** where we often post
93 - You can also follow RhodeCode on twitter **@RhodeCode** where we often post
89 news and other interesting stuff about RhodeCode.
94 news and other interesting stuff about RhodeCode.
90
95
91
96
92 Online documentation
97 Online documentation
93 --------------------
98 --------------------
94
99
95 Online documentation for the current version of RhodeCode is available at
100 Online documentation for the current version of RhodeCode is available at
96 - http://rhodecode.com/docs
101 - http://rhodecode.com/docs
97
102
98 You may also build the documentation for yourself - go into ``docs/`` and run::
103 You may also build the documentation for yourself - go into ``docs/`` and run::
99
104
100 nix-build default.nix -o result && make clean html
105 nix-build default.nix -o result && make clean html
101
106
102 (You need to have sphinx_ installed to build the documentation. If you don't
107 (You need to have sphinx_ installed to build the documentation. If you don't
103 have sphinx_ installed you can install it via the command:
108 have sphinx_ installed you can install it via the command:
104 ``pip install sphinx``)
109 ``pip install sphinx``)
105
110
106 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
111 .. _virtualenv: http://pypi.python.org/pypi/virtualenv
107 .. _python: http://www.python.org/
112 .. _python: http://www.python.org/
108 .. _sphinx: http://sphinx.pocoo.org/
113 .. _sphinx: http://sphinx.pocoo.org/
109 .. _mercurial: http://mercurial.selenic.com/
114 .. _mercurial: http://mercurial.selenic.com/
110 .. _bitbucket: http://bitbucket.org/
115 .. _bitbucket: http://bitbucket.org/
111 .. _github: http://github.com/
116 .. _github: http://github.com/
112 .. _gitlab: http://gitlab.com/
117 .. _gitlab: http://gitlab.com/
113 .. _subversion: http://subversion.tigris.org/
118 .. _subversion: http://subversion.tigris.org/
114 .. _git: http://git-scm.com/
119 .. _git: http://git-scm.com/
115 .. _celery: http://celeryproject.org/
120 .. _celery: http://celeryproject.org/
116 .. _vcs: http://pypi.python.org/pypi/vcs
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 ################################################################################
3 ; #########################################
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
4 ; RHODECODE COMMUNITY EDITION CONFIGURATION
5 ################################################################################
5 ; #########################################
6
6
7 [DEFAULT]
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 debug = true
9 debug = true
10
10
11 ################################################################################
11 ; ########################################################################
12 ## EMAIL CONFIGURATION ##
12 ; EMAIL CONFIGURATION
13 ## Uncomment and replace with the email address which should receive ##
13 ; These settings will be used by the RhodeCode mailing system
14 ## any error reports after an application crash ##
14 ; ########################################################################
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
16 ################################################################################
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 #email_prefix = [RhodeCode]
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 #app_email_from = rhodecode-noreply@localhost
20 #app_email_from = rhodecode-noreply@localhost
23
21
24 #smtp_server = mail.server.com
22 #smtp_server = mail.server.com
25 #smtp_username =
23 #smtp_username =
26 #smtp_password =
24 #smtp_password =
27 #smtp_port =
25 #smtp_port =
28 #smtp_use_tls = false
26 #smtp_use_tls = false
29 #smtp_use_ssl = true
27 #smtp_use_ssl = true
30
28
31 [server:main]
29 [server:main]
32 ## COMMON ##
30 ; COMMON HOST/IP CONFIG
33 host = 127.0.0.1
31 host = 127.0.0.1
34 port = 5000
32 port = 5000
35
33
36 ###########################################################
34 ; ##################################################
37 ## WAITRESS WSGI SERVER - Recommended for Development ####
35 ; WAITRESS WSGI SERVER - Recommended for Development
38 ###########################################################
36 ; ##################################################
39
37
38 ; use server type
40 use = egg:waitress#main
39 use = egg:waitress#main
41 ## number of worker threads
40
41 ; number of worker threads
42 threads = 5
42 threads = 5
43 ## MAX BODY SIZE 100GB
43
44 ; MAX BODY SIZE 100GB
44 max_request_body_size = 107374182400
45 max_request_body_size = 107374182400
45 ## Use poll instead of select, fixes file descriptors limits problems.
46
46 ## May not work on old windows systems.
47 ; Use poll instead of select, fixes file descriptors limits problems.
48 ; May not work on old windows systems.
47 asyncore_use_poll = true
49 asyncore_use_poll = true
48
50
49
51
50 ##########################
52 ; ###########################
51 ## GUNICORN WSGI SERVER ##
53 ; GUNICORN APPLICATION SERVER
52 ##########################
54 ; ###########################
53 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
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 #use = egg:gunicorn#main
59 #use = egg:gunicorn#main
56 ## Sets the number of process workers. More workers means more concurrent connections
60
57 ## RhodeCode can handle at the same time. Each additional worker also it increases
61 ; Sets the number of process workers. More workers means more concurrent connections
58 ## memory usage as each has it's own set of caches.
62 ; RhodeCode can handle at the same time. Each additional worker also it increases
59 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
63 ; memory usage as each has it's own set of caches.
60 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
64 ; Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
61 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
65 ; than 8-10 unless for really big deployments .e.g 700-1000 users.
62 ## when using more than 1 worker.
66 ; `instance_id = *` must be set in the [app:main] section below (which is the default)
67 ; when using more than 1 worker.
63 #workers = 2
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 #proc_name = rhodecode
74 #proc_name = rhodecode
66 ## type of worker class, one of sync, gevent
75
67 ## recommended for bigger setup is using of of other than sync one
76 ; Type of worker class, one of `sync`, `gevent`
77 ; Recommended type is `gevent`
68 #worker_class = gevent
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 #worker_connections = 10
81 #worker_connections = 10
71 ## max number of requests that worker will handle before being gracefully
82
72 ## restarted, could prevent memory leaks
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 #max_requests = 1000
85 #max_requests = 1000
74 #max_requests_jitter = 30
86 #max_requests_jitter = 30
75 ## amount of time a worker can spend with handling a request before it
87
76 ## gets killed and restarted. Set to 6hrs
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 #timeout = 21600
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.
132 ; Prefix middleware for RhodeCode.
81 ## recommended when using proxy setup.
133 ; recommended when using proxy setup.
82 ## allows to set RhodeCode under a prefix in server.
134 ; allows to set RhodeCode under a prefix in server.
83 ## eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
135 ; eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
84 ## And set your prefix like: `prefix = /custom_prefix`
136 ; And set your prefix like: `prefix = /custom_prefix`
85 ## be sure to also set beaker.session.cookie_path = /custom_prefix if you need
137 ; be sure to also set beaker.session.cookie_path = /custom_prefix if you need
86 ## to make your cookies only work on prefix url
138 ; to make your cookies only work on prefix url
87 [filter:proxy-prefix]
139 [filter:proxy-prefix]
88 use = egg:PasteDeploy#prefix
140 use = egg:PasteDeploy#prefix
89 prefix = /
141 prefix = /
90
142
91 [app:main]
143 [app:main]
92 ## The %(here)s variable will be replaced with the absolute path of parent directory
144 ; The %(here)s variable will be replaced with the absolute path of parent directory
93 ## of this file
145 ; of this file
94 ## In addition ENVIRONMENT variables usage is possible, e.g
146 ; In addition ENVIRONMENT variables usage is possible, e.g
95 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
147 ; sqlalchemy.db1.url = {ENV_RC_DB_URL}
96
148
97 use = egg:rhodecode-enterprise-ce
149 use = egg:rhodecode-enterprise-ce
98
150
99 ## enable proxy prefix middleware, defined above
151 ; enable proxy prefix middleware, defined above
100 #filter-with = proxy-prefix
152 #filter-with = proxy-prefix
101
153
154 ; #############
155 ; DEBUG OPTIONS
156 ; #############
157
158 pyramid.reload_templates = true
159
102 # During development the we want to have the debug toolbar enabled
160 # During development the we want to have the debug toolbar enabled
103 pyramid.includes =
161 pyramid.includes =
104 pyramid_debugtoolbar
162 pyramid_debugtoolbar
105 rhodecode.lib.middleware.request_wrapper
106
107 pyramid.reload_templates = true
108
163
109 debugtoolbar.hosts = 0.0.0.0/0
164 debugtoolbar.hosts = 0.0.0.0/0
110 debugtoolbar.exclude_prefixes =
165 debugtoolbar.exclude_prefixes =
111 /css
166 /css
112 /fonts
167 /fonts
113 /images
168 /images
114 /js
169 /js
115
170
116 ## RHODECODE PLUGINS ##
171 ## RHODECODE PLUGINS ##
117 rhodecode.includes =
172 rhodecode.includes =
118 rhodecode.api
173 rhodecode.api
119
174
120
175
121 # api prefix url
176 # api prefix url
122 rhodecode.api.url = /_admin/api
177 rhodecode.api.url = /_admin/api
123
178
124
179 ; enable debug style page
125 ## END RHODECODE PLUGINS ##
180 debug_style = true
126
181
127 ## encryption key used to encrypt social plugin tokens,
182 ; #################
128 ## remote_urls with credentials etc, if not set it defaults to
183 ; END DEBUG OPTIONS
129 ## `beaker.session.secret`
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 #rhodecode.encrypted_values.secret =
189 #rhodecode.encrypted_values.secret =
131
190
132 ## decryption strict mode (enabled by default). It controls if decryption raises
191 ; decryption strict mode (enabled by default). It controls if decryption raises
133 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
192 ; `SignatureVerificationError` in case of wrong key, or damaged encryption data.
134 #rhodecode.encrypted_values.strict = false
193 #rhodecode.encrypted_values.strict = false
135
194
136 ## Pick algorithm for encryption. Either fernet (more secure) or aes (default)
195 ; Pick algorithm for encryption. Either fernet (more secure) or aes (default)
137 ## fernet is safer, and we strongly recommend switching to it.
196 ; fernet is safer, and we strongly recommend switching to it.
138 ## Due to backward compatibility aes is used as default.
197 ; Due to backward compatibility aes is used as default.
139 #rhodecode.encrypted_values.algorithm = fernet
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 gzip_responses = false
201 gzip_responses = false
143
202
144 ## auto-generate javascript routes file on startup
203 ; Auto-generate javascript routes file on startup
145 generate_js_files = false
204 generate_js_files = false
146
205
147 ## System global default language.
206 ; System global default language.
148 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
207 ; All available languages: en (default), be, de, es, fr, it, ja, pl, pt, ru, zh
149 lang = en
208 lang = en
150
209
151 ## Perform a full repository scan and import on each server start.
210 ; Perform a full repository scan and import on each server start.
152 ## Settings this to true could lead to very long startup time.
211 ; Settings this to true could lead to very long startup time.
153 startup.import_repos = false
212 startup.import_repos = false
154
213
155 ## Uncomment and set this path to use archive download cache.
214 ; Uncomment and set this path to use archive download cache.
156 ## Once enabled, generated archives will be cached at this location
215 ; Once enabled, generated archives will be cached at this location
157 ## and served from the cache during subsequent requests for the same archive of
216 ; and served from the cache during subsequent requests for the same archive of
158 ## the repository.
217 ; the repository.
159 #archive_cache_dir = /tmp/tarballcache
218 #archive_cache_dir = /tmp/tarballcache
160
219
161 ## URL at which the application is running. This is used for Bootstrapping
220 ; 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
221 ; 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.
222 ; SSH calls. Set this for events to receive proper url for SSH calls.
164 app.base_url = http://rhodecode.local
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 app_instance_uuid = rc-production
226 app_instance_uuid = rc-production
168
227
169 ## Cut off limit for large diffs (size in bytes). If overall diff size on
228 ; 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
229 ; commit, or pull request exceeds this limit this diff will be displayed
171 ## partially. E.g 512000 == 512Kb
230 ; partially. E.g 512000 == 512Kb
172 cut_off_limit_diff = 512000
231 cut_off_limit_diff = 512000
173
232
174 ## Cut off limit for large files inside diffs (size in bytes). Each individual
233 ; 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.
234 ; file inside diff which exceeds this limit will be displayed partially.
176 ## E.g 128000 == 128Kb
235 ; E.g 128000 == 128Kb
177 cut_off_limit_file = 128000
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 vcs_full_cache = true
239 vcs_full_cache = true
181
240
182 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
241 ; 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
242 ; Normally this is controlled by proper flags sent from http server such as Nginx or Apache
184 force_https = false
243 force_https = false
185
244
186 ## use Strict-Transport-Security headers
245 ; use Strict-Transport-Security headers
187 use_htsts = false
246 use_htsts = false
188
247
189 ## git rev filter option, --all is the default filter, if you need to
248 ; Set to true if your repos are exposed using the dumb protocol
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
194 git_update_server_info = false
249 git_update_server_info = false
195
250
196 ## RSS/ATOM feed options
251 ; RSS/ATOM feed options
197 rss_cut_off_limit = 256000
252 rss_cut_off_limit = 256000
198 rss_items_per_page = 10
253 rss_items_per_page = 10
199 rss_include_diff = false
254 rss_include_diff = false
200
255
201 ## gist URL alias, used to create nicer urls for gist. This should be an
256 ; gist URL alias, used to create nicer urls for gist. This should be an
202 ## url that does rewrites to _admin/gists/{gistid}.
257 ; url that does rewrites to _admin/gists/{gistid}.
203 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
258 ; example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
204 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
259 ; RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
205 gist_alias_url =
260 gist_alias_url =
206
261
207 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
262 ; List of views (using glob pattern syntax) that AUTH TOKENS could be
208 ## used for access.
263 ; used for access.
209 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
264 ; 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.
265 ; 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
266 ; Additionally @TOKEN syntax can be used to bound the view to specific
212 ## authentication token. Such view would be only accessible when used together
267 ; authentication token. Such view would be only accessible when used together
213 ## with this authentication token
268 ; with this authentication token
214 ##
269 ; list of all views can be found under `/_admin/permissions/auth_token_access`
215 ## list of all views can be found under `/_admin/permissions/auth_token_access`
270 ; The list should be "," separated and on a single line.
216 ## The list should be "," separated and on a single line.
271 ; Most common views to enable:
217 ##
272
218 ## Most common views to enable:
219 # RepoCommitsView:repo_commit_download
273 # RepoCommitsView:repo_commit_download
220 # RepoCommitsView:repo_commit_patch
274 # RepoCommitsView:repo_commit_patch
221 # RepoCommitsView:repo_commit_raw
275 # RepoCommitsView:repo_commit_raw
222 # RepoCommitsView:repo_commit_raw@TOKEN
276 # RepoCommitsView:repo_commit_raw@TOKEN
223 # RepoFilesView:repo_files_diff
277 # RepoFilesView:repo_files_diff
224 # RepoFilesView:repo_archivefile
278 # RepoFilesView:repo_archivefile
225 # RepoFilesView:repo_file_raw
279 # RepoFilesView:repo_file_raw
226 # GistView:*
280 # GistView:*
227 api_access_controllers_whitelist =
281 api_access_controllers_whitelist =
228
282
229 ## Default encoding used to convert from and to unicode
283 ; Default encoding used to convert from and to unicode
230 ## can be also a comma separated list of encoding in case of mixed encodings
284 ; can be also a comma separated list of encoding in case of mixed encodings
231 default_encoding = UTF-8
285 default_encoding = UTF-8
232
286
233 ## instance-id prefix
287 ; instance-id prefix
234 ## a prefix key for this instance used for cache invalidation when running
288 ; a prefix key for this instance used for cache invalidation when running
235 ## multiple instances of RhodeCode, make sure it's globally unique for
289 ; multiple instances of RhodeCode, make sure it's globally unique for
236 ## all running RhodeCode instances. Leave empty if you don't use it
290 ; all running RhodeCode instances. Leave empty if you don't use it
237 instance_id =
291 instance_id =
238
292
239 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
293 ; 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.
294 ; 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
295 ; 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
296 ; authentication settings. Then you can enable e.g. the internal RhodeCode auth
243 ## module to log in again and fix the settings.
297 ; module to log in again and fix the settings.
244 ##
298 ; Available builtin plugin IDs (hash is part of the ID):
245 ## Available builtin plugin IDs (hash is part of the ID):
299 ; egg:rhodecode-enterprise-ce#rhodecode
246 ## egg:rhodecode-enterprise-ce#rhodecode
300 ; egg:rhodecode-enterprise-ce#pam
247 ## egg:rhodecode-enterprise-ce#pam
301 ; egg:rhodecode-enterprise-ce#ldap
248 ## egg:rhodecode-enterprise-ce#ldap
302 ; egg:rhodecode-enterprise-ce#jasig_cas
249 ## egg:rhodecode-enterprise-ce#jasig_cas
303 ; egg:rhodecode-enterprise-ce#headers
250 ## egg:rhodecode-enterprise-ce#headers
304 ; egg:rhodecode-enterprise-ce#crowd
251 ## egg:rhodecode-enterprise-ce#crowd
305
252 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
306 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
253
307
254 ## alternative return HTTP header for failed authentication. Default HTTP
308 ; Flag to control loading of legacy plugins in py:/path format
255 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
309 auth_plugin.import_legacy_plugins = true
256 ## handling that causing a series of failed authentication calls.
310
257 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
311 ; alternative return HTTP header for failed authentication. Default HTTP
258 ## This will be served instead of default 401 on bad authentication
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 auth_ret_code =
316 auth_ret_code =
260
317
261 ## use special detection method when serving auth_ret_code, instead of serving
318 ; use special detection method when serving auth_ret_code, instead of serving
262 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
319 ; ret_code directly, use 401 initially (Which triggers credentials prompt)
263 ## and then serve auth_ret_code to clients
320 ; and then serve auth_ret_code to clients
264 auth_ret_code_detection = false
321 auth_ret_code_detection = false
265
322
266 ## locking return code. When repository is locked return this HTTP code. 2XX
323 ; locking return code. When repository is locked return this HTTP code. 2XX
267 ## codes don't break the transactions while 4XX codes do
324 ; codes don't break the transactions while 4XX codes do
268 lock_ret_code = 423
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 allow_repo_location_change = true
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 allow_custom_hooks_settings = true
331 allow_custom_hooks_settings = true
275
332
276 ## Generated license token required for EE edition license.
333 ; Generated license token required for EE edition license.
277 ## New generated token value can be found in Admin > settings > license page.
334 ; New generated token value can be found in Admin > settings > license page.
278 license_token =
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 supervisor.uri =
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 supervisor.group_id = dev
344 supervisor.group_id = dev
284
345
285 ## Display extended labs settings
346 ; Display extended labs settings
286 labs_settings_active = true
347 labs_settings_active = true
287
348
288 ## Custom exception store path, defaults to TMPDIR
349 ; Custom exception store path, defaults to TMPDIR
289 ## This is used to store exception from RhodeCode in shared directory
350 ; This is used to store exception from RhodeCode in shared directory
290 #exception_tracker.store_path =
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 file_store.enabled = true
354 file_store.enabled = true
294 ## Storage backend, available options are: local
355
356 ; Storage backend, available options are: local
295 file_store.backend = local
357 file_store.backend = local
296 ## path to store the uploaded binaries
358
359 ; path to store the uploaded binaries
297 file_store.storage_path = %(here)s/data/file_store
360 file_store.storage_path = %(here)s/data/file_store
298
361
299
362
300 ####################################
363 ; #############
301 ### CELERY CONFIG ####
364 ; CELERY CONFIG
302 ####################################
365 ; #############
303 ## run: /path/to/celery worker \
366
304 ## -E --beat --app rhodecode.lib.celerylib.loader \
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
305 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
306 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
307
368
308 use_celery = false
369 use_celery = false
309
370
310 ## connection url to the message broker (default rabbitmq)
371 ; connection url to the message broker (default redis)
311 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
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 celery.max_tasks_per_child = 100
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 celery.task_always_eager = false
381 celery.task_always_eager = false
318
382
319 #####################################
383 ; #############
320 ### DOGPILE CACHE ####
384 ; DOGPILE CACHE
321 #####################################
385 ; #############
322 ## Default cache dir for caches. Putting this into a ramdisk
386
323 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
387 ; Default cache dir for caches. Putting this into a ramdisk can boost performance.
324 ## large amount of space
388 ; eg. /tmpfs/data_ramdisk, however this directory might require large amount of space
325 cache_dir = %(here)s/data
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 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
413 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
329 rc_cache.cache_perms.expiration_time = 300
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 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
419 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
333 #rc_cache.cache_perms.expiration_time = 300
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 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
423 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
336 #rc_cache.cache_perms.arguments.socket_timeout = 30
424
337 #rc_cache.cache_perms.arguments.host = localhost
425 #rc_cache.cache_perms.arguments.host = localhost
338 #rc_cache.cache_perms.arguments.port = 6379
426 #rc_cache.cache_perms.arguments.port = 6379
339 #rc_cache.cache_perms.arguments.db = 0
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 #rc_cache.cache_perms.arguments.distributed_lock = true
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 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
436 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
345 rc_cache.cache_repo.expiration_time = 2592000
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 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
442 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
349 #rc_cache.cache_repo.expiration_time = 2592000
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 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
446 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
352 #rc_cache.cache_repo.arguments.socket_timeout = 30
447
353 #rc_cache.cache_repo.arguments.host = localhost
448 #rc_cache.cache_repo.arguments.host = localhost
354 #rc_cache.cache_repo.arguments.port = 6379
449 #rc_cache.cache_repo.arguments.port = 6379
355 #rc_cache.cache_repo.arguments.db = 1
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 #rc_cache.cache_repo.arguments.distributed_lock = true
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
456 ; ##############
364 ## type backend as the objects kept are not pickle serializable
457 ; BEAKER SESSION
365 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
458 ; ##############
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
371
459
372
460 ; beaker.session.type is type of storage options for the logged users sessions. Current allowed
373 ####################################
461 ; types are file, ext:redis, ext:database, ext:memcached, and memory (default if not specified).
374 ### BEAKER SESSION ####
462 ; Fastest ones are Redis and ext:database
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).
379 beaker.session.type = file
463 beaker.session.type = file
380 beaker.session.data_dir = %(here)s/data/sessions
464 beaker.session.data_dir = %(here)s/data/sessions
381
465
382 ## redis sessions
466 ; Redis based sessions
383 #beaker.session.type = ext:redis
467 #beaker.session.type = ext:redis
384 #beaker.session.url = redis://127.0.0.1:6379/2
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 #beaker.session.type = ext:database
471 #beaker.session.type = ext:database
388 #beaker.session.table_name = db_session
472 #beaker.session.table_name = db_session
389 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
473 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
390 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
474 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
391 #beaker.session.sa.pool_recycle = 3600
475 #beaker.session.sa.pool_recycle = 3600
392 #beaker.session.sa.echo = false
476 #beaker.session.sa.echo = false
393
477
394 beaker.session.key = rhodecode
478 beaker.session.key = rhodecode
395 beaker.session.secret = develop-rc-uytcxaz
479 beaker.session.secret = develop-rc-uytcxaz
396 beaker.session.lock_dir = %(here)s/data/sessions/lock
480 beaker.session.lock_dir = %(here)s/data/sessions/lock
397
481
398 ## Secure encrypted cookie. Requires AES and AES python libraries
482 ; Secure encrypted cookie. Requires AES and AES python libraries
399 ## you must disable beaker.session.secret to use this
483 ; you must disable beaker.session.secret to use this
400 #beaker.session.encrypt_key = key_for_encryption
484 #beaker.session.encrypt_key = key_for_encryption
401 #beaker.session.validate_key = validation_key
485 #beaker.session.validate_key = validation_key
402
486
403 ## sets session as invalid(also logging out user) if it haven not been
487 ; Sets session as invalid (also logging out user) if it haven not been
404 ## accessed for given amount of time in seconds
488 ; accessed for given amount of time in seconds
405 beaker.session.timeout = 2592000
489 beaker.session.timeout = 2592000
406 beaker.session.httponly = true
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 #beaker.session.cookie_path = /custom_prefix
493 #beaker.session.cookie_path = /custom_prefix
409
494
410 ## uncomment for https secure cookie
495 ; Set https secure cookie
411 beaker.session.secure = false
496 beaker.session.secure = false
412
497
413 ## auto save the session to not to use .save()
498 ; default cookie expiration time in seconds, set to `true` to set expire
414 beaker.session.auto = false
499 ; at browser close
415
416 ## default cookie expiration time in seconds, set to `true` to set expire
417 ## at browser close
418 #beaker.session.cookie_expires = 3600
500 #beaker.session.cookie_expires = 3600
419
501
420 ###################################
502 ; #############################
421 ## SEARCH INDEXING CONFIGURATION ##
503 ; SEARCH INDEXING CONFIGURATION
422 ###################################
504 ; #############################
423 ## Full text search indexer is available in rhodecode-tools under
424 ## `rhodecode-tools index` command
425
505
426 ## WHOOSH Backend, doesn't require additional services to run
506 ; Full text search indexer is available in rhodecode-tools under
427 ## it works good with few dozen repos
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 search.module = rhodecode.lib.index.whoosh
511 search.module = rhodecode.lib.index.whoosh
429 search.location = %(here)s/data/index
512 search.location = %(here)s/data/index
430
513
431 ########################################
514 ; ####################
432 ### CHANNELSTREAM CONFIG ####
515 ; CHANNELSTREAM CONFIG
433 ########################################
516 ; ####################
434 ## channelstream enables persistent connections and live notification
517
435 ## in the system. It's also used by the chat system
518 ; channelstream enables persistent connections and live notification
519 ; in the system. It's also used by the chat system
436
520
437 channelstream.enabled = false
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 channelstream.server = 127.0.0.1:9800
524 channelstream.server = 127.0.0.1:9800
441
525
442 ## location of the channelstream server from outside world
526 ; location of the channelstream server from outside world
443 ## use ws:// for http or wss:// for https. This address needs to be handled
527 ; use ws:// for http or wss:// for https. This address needs to be handled
444 ## by external HTTP server such as Nginx or Apache
528 ; by external HTTP server such as Nginx or Apache
445 ## see Nginx/Apache configuration examples in our docs
529 ; see Nginx/Apache configuration examples in our docs
446 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
530 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
447 channelstream.secret = secret
531 channelstream.secret = secret
448 channelstream.history.location = %(here)s/channelstream_history
532 channelstream.history.location = %(here)s/channelstream_history
449
533
450 ## Internal application path that Javascript uses to connect into.
534 ; Internal application path that Javascript uses to connect into.
451 ## If you use proxy-prefix the prefix should be added before /_channelstream
535 ; If you use proxy-prefix the prefix should be added before /_channelstream
452 channelstream.proxy_path = /_channelstream
536 channelstream.proxy_path = /_channelstream
453
537
454
538
455 ###################################
539 ; ##############################
456 ## APPENLIGHT CONFIG ##
540 ; MAIN RHODECODE DATABASE CONFIG
457 ###################################
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
612 ; ####################################################
460 ## http://appenlight.com for details how to obtain an account
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 appenlight = false
693 appenlight = false
464
694
465 appenlight.server_url = https://api.appenlight.com
695 appenlight.server_url = https://api.appenlight.com
466 appenlight.api_key = YOUR_API_KEY
696 appenlight.api_key = YOUR_API_KEY
467 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
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 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
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 appenlight.report_404 = false
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 appenlight.slow_request_time = 1
708 appenlight.slow_request_time = 1
479
709
480 ## record slow requests in application
710 ; record slow requests in application
481 ## (needs to be enabled for slow datastore recording and time tracking)
711 ; (needs to be enabled for slow datastore recording and time tracking)
482 appenlight.slow_requests = true
712 appenlight.slow_requests = true
483
713
484 ## enable hooking to application loggers
714 ; enable hooking to application loggers
485 appenlight.logging = true
715 appenlight.logging = true
486
716
487 ## minimum log level for log capture
717 ; minimum log level for log capture
488 appenlight.logging.level = WARNING
718 appenlight.logging.level = WARNING
489
719
490 ## send logs only from erroneous/slow requests
720 ; send logs only from erroneous/slow requests
491 ## (saves API quota for intensive logging)
721 ; (saves API quota for intensive logging)
492 appenlight.logging_on_error = false
722 appenlight.logging_on_error = false
493
723
494 ## list of additional keywords that should be grabbed from environ object
724 ; list of additional keywords that should be grabbed from environ object
495 ## can be string with comma separated list of words in lowercase
725 ; can be string with comma separated list of words in lowercase
496 ## (by default client will always send following info:
726 ; (by default client will always send following info:
497 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
727 ; 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
498 ## start with HTTP* this list be extended with additional keywords here
728 ; start with HTTP* this list be extended with additional keywords here
499 appenlight.environ_keys_whitelist =
729 appenlight.environ_keys_whitelist =
500
730
501 ## list of keywords that should be blanked from request object
731 ; list of keywords that should be blanked from request object
502 ## can be string with comma separated list of words in lowercase
732 ; can be string with comma separated list of words in lowercase
503 ## (by default client will always blank keys that contain following words
733 ; (by default client will always blank keys that contain following words
504 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
734 ; 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
505 ## this list be extended with additional keywords set here
735 ; this list be extended with additional keywords set here
506 appenlight.request_keys_blacklist =
736 appenlight.request_keys_blacklist =
507
737
508 ## list of namespaces that should be ignores when gathering log entries
738 ; list of namespaces that should be ignores when gathering log entries
509 ## can be string with comma separated list of namespaces
739 ; can be string with comma separated list of namespaces
510 ## (by default the client ignores own entries: appenlight_client.client)
740 ; (by default the client ignores own entries: appenlight_client.client)
511 appenlight.log_namespace_blacklist =
741 appenlight.log_namespace_blacklist =
512
742
513 # enable debug style page
743 ; Dummy marker to add new entries after.
514 debug_style = true
744 ; Add any custom entries below. Please don't remove this marker.
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.
653 custom.conf = 1
745 custom.conf = 1
654
746
655
747
656 ################################
748 ; #####################
657 ### LOGGING CONFIGURATION ####
749 ; LOGGING CONFIGURATION
658 ################################
750 ; #####################
659 [loggers]
751 [loggers]
660 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
752 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
661
753
662 [handlers]
754 [handlers]
663 keys = console, console_sql
755 keys = console, console_sql
664
756
665 [formatters]
757 [formatters]
666 keys = generic, color_formatter, color_formatter_sql
758 keys = generic, color_formatter, color_formatter_sql
667
759
668 #############
760 ; #######
669 ## LOGGERS ##
761 ; LOGGERS
670 #############
762 ; #######
671 [logger_root]
763 [logger_root]
672 level = NOTSET
764 level = NOTSET
673 handlers = console
765 handlers = console
674
766
675 [logger_sqlalchemy]
767 [logger_sqlalchemy]
676 level = INFO
768 level = INFO
677 handlers = console_sql
769 handlers = console_sql
678 qualname = sqlalchemy.engine
770 qualname = sqlalchemy.engine
679 propagate = 0
771 propagate = 0
680
772
681 [logger_beaker]
773 [logger_beaker]
682 level = DEBUG
774 level = DEBUG
683 handlers =
775 handlers =
684 qualname = beaker.container
776 qualname = beaker.container
685 propagate = 1
777 propagate = 1
686
778
687 [logger_rhodecode]
779 [logger_rhodecode]
688 level = DEBUG
780 level = DEBUG
689 handlers =
781 handlers =
690 qualname = rhodecode
782 qualname = rhodecode
691 propagate = 1
783 propagate = 1
692
784
693 [logger_ssh_wrapper]
785 [logger_ssh_wrapper]
694 level = DEBUG
786 level = DEBUG
695 handlers =
787 handlers =
696 qualname = ssh_wrapper
788 qualname = ssh_wrapper
697 propagate = 1
789 propagate = 1
698
790
699 [logger_celery]
791 [logger_celery]
700 level = DEBUG
792 level = DEBUG
701 handlers =
793 handlers =
702 qualname = celery
794 qualname = celery
703
795
704
796
705 ##############
797 ; ########
706 ## HANDLERS ##
798 ; HANDLERS
707 ##############
799 ; ########
708
800
709 [handler_console]
801 [handler_console]
710 class = StreamHandler
802 class = StreamHandler
711 args = (sys.stderr, )
803 args = (sys.stderr, )
712 level = DEBUG
804 level = DEBUG
713 formatter = color_formatter
805 formatter = color_formatter
714
806
715 [handler_console_sql]
807 [handler_console_sql]
716 # "level = DEBUG" logs SQL queries and results.
808 ; "level = DEBUG" logs SQL queries and results.
717 # "level = INFO" logs SQL queries.
809 ; "level = INFO" logs SQL queries.
718 # "level = WARN" logs neither. (Recommended for production systems.)
810 ; "level = WARN" logs neither. (Recommended for production systems.)
719 class = StreamHandler
811 class = StreamHandler
720 args = (sys.stderr, )
812 args = (sys.stderr, )
721 level = WARN
813 level = WARN
722 formatter = color_formatter_sql
814 formatter = color_formatter_sql
723
815
724 ################
816 ; ##########
725 ## FORMATTERS ##
817 ; FORMATTERS
726 ################
818 ; ##########
727
819
728 [formatter_generic]
820 [formatter_generic]
729 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
821 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
730 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
822 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
731 datefmt = %Y-%m-%d %H:%M:%S
823 datefmt = %Y-%m-%d %H:%M:%S
732
824
733 [formatter_color_formatter]
825 [formatter_color_formatter]
734 class = rhodecode.lib.logging_formatter.ColorFormatter
826 class = rhodecode.lib.logging_formatter.ColorFormatter
735 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
827 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
736 datefmt = %Y-%m-%d %H:%M:%S
828 datefmt = %Y-%m-%d %H:%M:%S
737
829
738 [formatter_color_formatter_sql]
830 [formatter_color_formatter_sql]
739 class = rhodecode.lib.logging_formatter.ColorFormatterSql
831 class = rhodecode.lib.logging_formatter.ColorFormatterSql
740 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
832 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
741 datefmt = %Y-%m-%d %H:%M:%S
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
2 Gunicorn config extension and hooks. This config file adds some extra settings and memory management.
3 available post the .ini config.
3 Gunicorn configuration should be managed by .ini files entries of RhodeCode or VCSServer
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
14 """
4 """
15
5
16 import multiprocessing
6 import gc
7 import os
17 import sys
8 import sys
9 import math
18 import time
10 import time
19 import datetime
20 import threading
11 import threading
21 import traceback
12 import traceback
13 import random
22 from gunicorn.glogging import Logger
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 # GLOBAL
21 # GLOBAL
26 errorlog = '-'
22 errorlog = '-'
27 accesslog = '-'
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 # SERVER MECHANICS
26 # SERVER MECHANICS
59 # None == system temp dir
27 # None == system temp dir
60 # worker_tmp_dir is recommended to be set to some tmpfs
28 # worker_tmp_dir is recommended to be set to some tmpfs
61 worker_tmp_dir = None
29 worker_tmp_dir = None
62 tmp_upload_dir = None
30 tmp_upload_dir = None
63
31
64 # Custom log format
32 # Custom log format
65 access_log_format = (
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 # self adjust workers based on CPU count
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):
52 def _get_config(ini_path):
73 server.log.info("[<%-10s>] WORKER spawned", worker.pid)
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 def pre_fork(server, worker):
70 def pre_fork(server, worker):
77 pass
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 def pre_exec(server):
111 def pre_exec(server):
81 server.log.info("Forked child, re-executing.")
112 server.log.info("Forked child, re-executing.")
82
113
83
114
84 def on_starting(server):
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 def when_ready(server):
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 def on_reload(server):
124 def on_reload(server):
93 pass
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 def worker_int(worker):
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 # get traceback info, on worker crash
207 # get traceback info, on worker crash
100 id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
208 id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
101 code = []
209 code = []
102 for thread_id, stack in sys._current_frames().items():
210 for thread_id, stack in sys._current_frames().items():
103 code.append(
211 code.append(
104 "\n# Thread: %s(%d)" % (id2name.get(thread_id, ""), thread_id))
212 "\n# Thread: %s(%d)" % (id2name.get(thread_id, ""), thread_id))
105 for fname, lineno, name, line in traceback.extract_stack(stack):
213 for fname, lineno, name, line in traceback.extract_stack(stack):
106 code.append('File: "%s", line %d, in %s' % (fname, lineno, name))
214 code.append('File: "%s", line %d, in %s' % (fname, lineno, name))
107 if line:
215 if line:
108 code.append(" %s" % (line.strip()))
216 code.append(" %s" % (line.strip()))
109 worker.log.debug("\n".join(code))
217 worker.log.debug("\n".join(code))
110
218
111
219
112 def worker_abort(worker):
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 def worker_exit(server, worker):
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 def child_exit(server, worker):
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 def pre_request(worker, req):
232 def pre_request(worker, req):
125 worker.start_time = time.time()
233 worker.start_time = time.time()
126 worker.log.debug(
234 worker.log.debug(
127 "GNCRN PRE WORKER [cnt:%s]: %s %s", worker.nr, req.method, req.path)
235 "GNCRN PRE WORKER [cnt:%s]: %s %s", worker.nr, req.method, req.path)
128
236
129
237
130 def post_request(worker, req, environ, resp):
238 def post_request(worker, req, environ, resp):
131 total_time = time.time() - worker.start_time
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 worker.log.debug(
242 worker.log.debug(
133 "GNCRN POST WORKER [cnt:%s]: %s %s resp: %s, Load Time: %.3fs",
243 "GNCRN POST WORKER [cnt:%s]: %s %s resp: %s, Load Time: %.4fs",
134 worker.nr, req.method, req.path, resp.status_code, total_time)
244 worker.nr, req.method, req.path, status_code, total_time)
245 _check_memory_usage(worker)
135
246
136
247
137 class RhodeCodeLogger(Logger):
248 class RhodeCodeLogger(Logger):
138 """
249 """
139 Custom Logger that allows some customization that gunicorn doesn't allow
250 Custom Logger that allows some customization that gunicorn doesn't allow
140 """
251 """
141
252
142 datefmt = r"%Y-%m-%d %H:%M:%S"
253 datefmt = r"%Y-%m-%d %H:%M:%S"
143
254
144 def __init__(self, cfg):
255 def __init__(self, cfg):
145 Logger.__init__(self, cfg)
256 Logger.__init__(self, cfg)
146
257
147 def now(self):
258 def now(self):
148 """ return date in RhodeCode Log format """
259 """ return date in RhodeCode Log format """
149 now = time.time()
260 now = time.time()
150 msecs = int((now - long(now)) * 1000)
261 msecs = int((now - long(now)) * 1000)
151 return time.strftime(self.datefmt, time.localtime(now)) + '.{0:03d}'.format(msecs)
262 return time.strftime(self.datefmt, time.localtime(now)) + '.{0:03d}'.format(msecs)
152
263
153
264
154 logger_class = RhodeCodeLogger
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 ################################################################################
3 ; #########################################
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
4 ; RHODECODE COMMUNITY EDITION CONFIGURATION
5 ################################################################################
5 ; #########################################
6
6
7 [DEFAULT]
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 debug = false
9 debug = false
10
10
11 ################################################################################
11 ; ########################################################################
12 ## EMAIL CONFIGURATION ##
12 ; EMAIL CONFIGURATION
13 ## Uncomment and replace with the email address which should receive ##
13 ; These settings will be used by the RhodeCode mailing system
14 ## any error reports after an application crash ##
14 ; ########################################################################
15 ## Additionally these settings will be used by the RhodeCode mailing system ##
16 ################################################################################
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 #email_prefix = [RhodeCode]
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 #app_email_from = rhodecode-noreply@localhost
20 #app_email_from = rhodecode-noreply@localhost
23
21
24 #smtp_server = mail.server.com
22 #smtp_server = mail.server.com
25 #smtp_username =
23 #smtp_username =
26 #smtp_password =
24 #smtp_password =
27 #smtp_port =
25 #smtp_port =
28 #smtp_use_tls = false
26 #smtp_use_tls = false
29 #smtp_use_ssl = true
27 #smtp_use_ssl = true
30
28
31 [server:main]
29 [server:main]
32 ## COMMON ##
30 ; COMMON HOST/IP CONFIG
33 host = 127.0.0.1
31 host = 127.0.0.1
34 port = 5000
32 port = 5000
35
33
36 ###########################################################
34
37 ## WAITRESS WSGI SERVER - Recommended for Development ####
35 ; ###########################
38 ###########################################################
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
71 ; Amount of time a worker can spend with handling a request before it
41 ## number of worker threads
72 ; gets killed and restarted. By default set to 21600 (6hrs)
42 #threads = 5
73 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
43 ## MAX BODY SIZE 100GB
74 timeout = 21600
44 #max_request_body_size = 107374182400
75
45 ## Use poll instead of select, fixes file descriptors limits problems.
76 ; The maximum size of HTTP request line in bytes.
46 ## May not work on old windows systems.
77 ; 0 for unlimited
47 #asyncore_use_poll = true
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 ##########################
115 ; Prefix middleware for RhodeCode.
51 ## GUNICORN WSGI SERVER ##
116 ; recommended when using proxy setup.
52 ##########################
117 ; allows to set RhodeCode under a prefix in server.
53 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
118 ; eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
54
119 ; And set your prefix like: `prefix = /custom_prefix`
55 use = egg:gunicorn#main
120 ; be sure to also set beaker.session.cookie_path = /custom_prefix if you need
56 ## Sets the number of process workers. More workers means more concurrent connections
121 ; to make your cookies only work on prefix url
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
87 [filter:proxy-prefix]
122 [filter:proxy-prefix]
88 use = egg:PasteDeploy#prefix
123 use = egg:PasteDeploy#prefix
89 prefix = /
124 prefix = /
90
125
91 [app:main]
126 [app:main]
92 ## The %(here)s variable will be replaced with the absolute path of parent directory
127 ; The %(here)s variable will be replaced with the absolute path of parent directory
93 ## of this file
128 ; of this file
94 ## In addition ENVIRONMENT variables usage is possible, e.g
129 ; In addition ENVIRONMENT variables usage is possible, e.g
95 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
130 ; sqlalchemy.db1.url = {ENV_RC_DB_URL}
96
131
97 use = egg:rhodecode-enterprise-ce
132 use = egg:rhodecode-enterprise-ce
98
133
99 ## enable proxy prefix middleware, defined above
134 ; enable proxy prefix middleware, defined above
100 #filter-with = proxy-prefix
135 #filter-with = proxy-prefix
101
136
102 ## encryption key used to encrypt social plugin tokens,
137 ; encryption key used to encrypt social plugin tokens,
103 ## remote_urls with credentials etc, if not set it defaults to
138 ; remote_urls with credentials etc, if not set it defaults to
104 ## `beaker.session.secret`
139 ; `beaker.session.secret`
105 #rhodecode.encrypted_values.secret =
140 #rhodecode.encrypted_values.secret =
106
141
107 ## decryption strict mode (enabled by default). It controls if decryption raises
142 ; decryption strict mode (enabled by default). It controls if decryption raises
108 ## `SignatureVerificationError` in case of wrong key, or damaged encryption data.
143 ; `SignatureVerificationError` in case of wrong key, or damaged encryption data.
109 #rhodecode.encrypted_values.strict = false
144 #rhodecode.encrypted_values.strict = false
110
145
111 ## Pick algorithm for encryption. Either fernet (more secure) or aes (default)
146 ; Pick algorithm for encryption. Either fernet (more secure) or aes (default)
112 ## fernet is safer, and we strongly recommend switching to it.
147 ; fernet is safer, and we strongly recommend switching to it.
113 ## Due to backward compatibility aes is used as default.
148 ; Due to backward compatibility aes is used as default.
114 #rhodecode.encrypted_values.algorithm = fernet
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 gzip_responses = false
152 gzip_responses = false
118
153
119 ## auto-generate javascript routes file on startup
154 ; Auto-generate javascript routes file on startup
120 generate_js_files = false
155 generate_js_files = false
121
156
122 ## System global default language.
157 ; System global default language.
123 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
158 ; All available languages: en (default), be, de, es, fr, it, ja, pl, pt, ru, zh
124 lang = en
159 lang = en
125
160
126 ## Perform a full repository scan and import on each server start.
161 ; Perform a full repository scan and import on each server start.
127 ## Settings this to true could lead to very long startup time.
162 ; Settings this to true could lead to very long startup time.
128 startup.import_repos = false
163 startup.import_repos = false
129
164
130 ## Uncomment and set this path to use archive download cache.
165 ; Uncomment and set this path to use archive download cache.
131 ## Once enabled, generated archives will be cached at this location
166 ; Once enabled, generated archives will be cached at this location
132 ## and served from the cache during subsequent requests for the same archive of
167 ; and served from the cache during subsequent requests for the same archive of
133 ## the repository.
168 ; the repository.
134 #archive_cache_dir = /tmp/tarballcache
169 #archive_cache_dir = /tmp/tarballcache
135
170
136 ## URL at which the application is running. This is used for Bootstrapping
171 ; 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
172 ; 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.
173 ; SSH calls. Set this for events to receive proper url for SSH calls.
139 app.base_url = http://rhodecode.local
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 app_instance_uuid = rc-production
177 app_instance_uuid = rc-production
143
178
144 ## Cut off limit for large diffs (size in bytes). If overall diff size on
179 ; 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
180 ; commit, or pull request exceeds this limit this diff will be displayed
146 ## partially. E.g 512000 == 512Kb
181 ; partially. E.g 512000 == 512Kb
147 cut_off_limit_diff = 512000
182 cut_off_limit_diff = 512000
148
183
149 ## Cut off limit for large files inside diffs (size in bytes). Each individual
184 ; 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.
185 ; file inside diff which exceeds this limit will be displayed partially.
151 ## E.g 128000 == 128Kb
186 ; E.g 128000 == 128Kb
152 cut_off_limit_file = 128000
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 vcs_full_cache = true
190 vcs_full_cache = true
156
191
157 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
192 ; 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
193 ; Normally this is controlled by proper flags sent from http server such as Nginx or Apache
159 force_https = false
194 force_https = false
160
195
161 ## use Strict-Transport-Security headers
196 ; use Strict-Transport-Security headers
162 use_htsts = false
197 use_htsts = false
163
198
164 ## git rev filter option, --all is the default filter, if you need to
199 ; Set to true if your repos are exposed using the dumb protocol
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
169 git_update_server_info = false
200 git_update_server_info = false
170
201
171 ## RSS/ATOM feed options
202 ; RSS/ATOM feed options
172 rss_cut_off_limit = 256000
203 rss_cut_off_limit = 256000
173 rss_items_per_page = 10
204 rss_items_per_page = 10
174 rss_include_diff = false
205 rss_include_diff = false
175
206
176 ## gist URL alias, used to create nicer urls for gist. This should be an
207 ; gist URL alias, used to create nicer urls for gist. This should be an
177 ## url that does rewrites to _admin/gists/{gistid}.
208 ; url that does rewrites to _admin/gists/{gistid}.
178 ## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
209 ; example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
179 ## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
210 ; RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
180 gist_alias_url =
211 gist_alias_url =
181
212
182 ## List of views (using glob pattern syntax) that AUTH TOKENS could be
213 ; List of views (using glob pattern syntax) that AUTH TOKENS could be
183 ## used for access.
214 ; used for access.
184 ## Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
215 ; 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.
216 ; 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
217 ; Additionally @TOKEN syntax can be used to bound the view to specific
187 ## authentication token. Such view would be only accessible when used together
218 ; authentication token. Such view would be only accessible when used together
188 ## with this authentication token
219 ; with this authentication token
189 ##
220 ; list of all views can be found under `/_admin/permissions/auth_token_access`
190 ## list of all views can be found under `/_admin/permissions/auth_token_access`
221 ; The list should be "," separated and on a single line.
191 ## The list should be "," separated and on a single line.
222 ; Most common views to enable:
192 ##
223
193 ## Most common views to enable:
194 # RepoCommitsView:repo_commit_download
224 # RepoCommitsView:repo_commit_download
195 # RepoCommitsView:repo_commit_patch
225 # RepoCommitsView:repo_commit_patch
196 # RepoCommitsView:repo_commit_raw
226 # RepoCommitsView:repo_commit_raw
197 # RepoCommitsView:repo_commit_raw@TOKEN
227 # RepoCommitsView:repo_commit_raw@TOKEN
198 # RepoFilesView:repo_files_diff
228 # RepoFilesView:repo_files_diff
199 # RepoFilesView:repo_archivefile
229 # RepoFilesView:repo_archivefile
200 # RepoFilesView:repo_file_raw
230 # RepoFilesView:repo_file_raw
201 # GistView:*
231 # GistView:*
202 api_access_controllers_whitelist =
232 api_access_controllers_whitelist =
203
233
204 ## Default encoding used to convert from and to unicode
234 ; Default encoding used to convert from and to unicode
205 ## can be also a comma separated list of encoding in case of mixed encodings
235 ; can be also a comma separated list of encoding in case of mixed encodings
206 default_encoding = UTF-8
236 default_encoding = UTF-8
207
237
208 ## instance-id prefix
238 ; instance-id prefix
209 ## a prefix key for this instance used for cache invalidation when running
239 ; a prefix key for this instance used for cache invalidation when running
210 ## multiple instances of RhodeCode, make sure it's globally unique for
240 ; multiple instances of RhodeCode, make sure it's globally unique for
211 ## all running RhodeCode instances. Leave empty if you don't use it
241 ; all running RhodeCode instances. Leave empty if you don't use it
212 instance_id =
242 instance_id =
213
243
214 ## Fallback authentication plugin. Set this to a plugin ID to force the usage
244 ; 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.
245 ; 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
246 ; 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
247 ; authentication settings. Then you can enable e.g. the internal RhodeCode auth
218 ## module to log in again and fix the settings.
248 ; module to log in again and fix the settings.
219 ##
249 ; Available builtin plugin IDs (hash is part of the ID):
220 ## Available builtin plugin IDs (hash is part of the ID):
250 ; egg:rhodecode-enterprise-ce#rhodecode
221 ## egg:rhodecode-enterprise-ce#rhodecode
251 ; egg:rhodecode-enterprise-ce#pam
222 ## egg:rhodecode-enterprise-ce#pam
252 ; egg:rhodecode-enterprise-ce#ldap
223 ## egg:rhodecode-enterprise-ce#ldap
253 ; egg:rhodecode-enterprise-ce#jasig_cas
224 ## egg:rhodecode-enterprise-ce#jasig_cas
254 ; egg:rhodecode-enterprise-ce#headers
225 ## egg:rhodecode-enterprise-ce#headers
255 ; egg:rhodecode-enterprise-ce#crowd
226 ## egg:rhodecode-enterprise-ce#crowd
256
227 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
257 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
228
258
229 ## alternative return HTTP header for failed authentication. Default HTTP
259 ; Flag to control loading of legacy plugins in py:/path format
230 ## response is 401 HTTPUnauthorized. Currently HG clients have troubles with
260 auth_plugin.import_legacy_plugins = true
231 ## handling that causing a series of failed authentication calls.
261
232 ## Set this variable to 403 to return HTTPForbidden, or any other HTTP code
262 ; alternative return HTTP header for failed authentication. Default HTTP
233 ## This will be served instead of default 401 on bad authentication
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 auth_ret_code =
267 auth_ret_code =
235
268
236 ## use special detection method when serving auth_ret_code, instead of serving
269 ; use special detection method when serving auth_ret_code, instead of serving
237 ## ret_code directly, use 401 initially (Which triggers credentials prompt)
270 ; ret_code directly, use 401 initially (Which triggers credentials prompt)
238 ## and then serve auth_ret_code to clients
271 ; and then serve auth_ret_code to clients
239 auth_ret_code_detection = false
272 auth_ret_code_detection = false
240
273
241 ## locking return code. When repository is locked return this HTTP code. 2XX
274 ; locking return code. When repository is locked return this HTTP code. 2XX
242 ## codes don't break the transactions while 4XX codes do
275 ; codes don't break the transactions while 4XX codes do
243 lock_ret_code = 423
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 allow_repo_location_change = true
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 allow_custom_hooks_settings = true
282 allow_custom_hooks_settings = true
250
283
251 ## Generated license token required for EE edition license.
284 ; Generated license token required for EE edition license.
252 ## New generated token value can be found in Admin > settings > license page.
285 ; New generated token value can be found in Admin > settings > license page.
253 license_token =
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 supervisor.uri =
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 supervisor.group_id = prod
295 supervisor.group_id = prod
259
296
260 ## Display extended labs settings
297 ; Display extended labs settings
261 labs_settings_active = true
298 labs_settings_active = true
262
299
263 ## Custom exception store path, defaults to TMPDIR
300 ; Custom exception store path, defaults to TMPDIR
264 ## This is used to store exception from RhodeCode in shared directory
301 ; This is used to store exception from RhodeCode in shared directory
265 #exception_tracker.store_path =
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 file_store.enabled = true
305 file_store.enabled = true
269 ## Storage backend, available options are: local
306
307 ; Storage backend, available options are: local
270 file_store.backend = local
308 file_store.backend = local
271 ## path to store the uploaded binaries
309
310 ; path to store the uploaded binaries
272 file_store.storage_path = %(here)s/data/file_store
311 file_store.storage_path = %(here)s/data/file_store
273
312
274
313
275 ####################################
314 ; #############
276 ### CELERY CONFIG ####
315 ; CELERY CONFIG
277 ####################################
316 ; #############
278 ## run: /path/to/celery worker \
317
279 ## -E --beat --app rhodecode.lib.celerylib.loader \
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
280 ## --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler \
281 ## --loglevel DEBUG --ini /path/to/rhodecode.ini
282
319
283 use_celery = false
320 use_celery = false
284
321
285 ## connection url to the message broker (default rabbitmq)
322 ; connection url to the message broker (default redis)
286 celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
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 celery.max_tasks_per_child = 100
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 celery.task_always_eager = false
332 celery.task_always_eager = false
293
333
294 #####################################
334 ; #############
295 ### DOGPILE CACHE ####
335 ; DOGPILE CACHE
296 #####################################
336 ; #############
297 ## Default cache dir for caches. Putting this into a ramdisk
337
298 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
338 ; Default cache dir for caches. Putting this into a ramdisk can boost performance.
299 ## large amount of space
339 ; eg. /tmpfs/data_ramdisk, however this directory might require large amount of space
300 cache_dir = %(here)s/data
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 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
364 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
304 rc_cache.cache_perms.expiration_time = 300
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 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
370 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
308 #rc_cache.cache_perms.expiration_time = 300
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 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
374 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
311 #rc_cache.cache_perms.arguments.socket_timeout = 30
375
312 #rc_cache.cache_perms.arguments.host = localhost
376 #rc_cache.cache_perms.arguments.host = localhost
313 #rc_cache.cache_perms.arguments.port = 6379
377 #rc_cache.cache_perms.arguments.port = 6379
314 #rc_cache.cache_perms.arguments.db = 0
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 #rc_cache.cache_perms.arguments.distributed_lock = true
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 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
387 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
320 rc_cache.cache_repo.expiration_time = 2592000
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 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
393 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
324 #rc_cache.cache_repo.expiration_time = 2592000
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 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
397 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
327 #rc_cache.cache_repo.arguments.socket_timeout = 30
398
328 #rc_cache.cache_repo.arguments.host = localhost
399 #rc_cache.cache_repo.arguments.host = localhost
329 #rc_cache.cache_repo.arguments.port = 6379
400 #rc_cache.cache_repo.arguments.port = 6379
330 #rc_cache.cache_repo.arguments.db = 1
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 #rc_cache.cache_repo.arguments.distributed_lock = true
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
407 ; ##############
339 ## type backend as the objects kept are not pickle serializable
408 ; BEAKER SESSION
340 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
409 ; ##############
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
346
410
347
411 ; beaker.session.type is type of storage options for the logged users sessions. Current allowed
348 ####################################
412 ; types are file, ext:redis, ext:database, ext:memcached, and memory (default if not specified).
349 ### BEAKER SESSION ####
413 ; Fastest ones are Redis and ext:database
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).
354 beaker.session.type = file
414 beaker.session.type = file
355 beaker.session.data_dir = %(here)s/data/sessions
415 beaker.session.data_dir = %(here)s/data/sessions
356
416
357 ## redis sessions
417 ; Redis based sessions
358 #beaker.session.type = ext:redis
418 #beaker.session.type = ext:redis
359 #beaker.session.url = redis://127.0.0.1:6379/2
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 #beaker.session.type = ext:database
422 #beaker.session.type = ext:database
363 #beaker.session.table_name = db_session
423 #beaker.session.table_name = db_session
364 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
424 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
365 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
425 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
366 #beaker.session.sa.pool_recycle = 3600
426 #beaker.session.sa.pool_recycle = 3600
367 #beaker.session.sa.echo = false
427 #beaker.session.sa.echo = false
368
428
369 beaker.session.key = rhodecode
429 beaker.session.key = rhodecode
370 beaker.session.secret = production-rc-uytcxaz
430 beaker.session.secret = production-rc-uytcxaz
371 beaker.session.lock_dir = %(here)s/data/sessions/lock
431 beaker.session.lock_dir = %(here)s/data/sessions/lock
372
432
373 ## Secure encrypted cookie. Requires AES and AES python libraries
433 ; Secure encrypted cookie. Requires AES and AES python libraries
374 ## you must disable beaker.session.secret to use this
434 ; you must disable beaker.session.secret to use this
375 #beaker.session.encrypt_key = key_for_encryption
435 #beaker.session.encrypt_key = key_for_encryption
376 #beaker.session.validate_key = validation_key
436 #beaker.session.validate_key = validation_key
377
437
378 ## sets session as invalid(also logging out user) if it haven not been
438 ; Sets session as invalid (also logging out user) if it haven not been
379 ## accessed for given amount of time in seconds
439 ; accessed for given amount of time in seconds
380 beaker.session.timeout = 2592000
440 beaker.session.timeout = 2592000
381 beaker.session.httponly = true
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 #beaker.session.cookie_path = /custom_prefix
444 #beaker.session.cookie_path = /custom_prefix
384
445
385 ## uncomment for https secure cookie
446 ; Set https secure cookie
386 beaker.session.secure = false
447 beaker.session.secure = false
387
448
388 ## auto save the session to not to use .save()
449 ; default cookie expiration time in seconds, set to `true` to set expire
389 beaker.session.auto = false
450 ; at browser close
390
391 ## default cookie expiration time in seconds, set to `true` to set expire
392 ## at browser close
393 #beaker.session.cookie_expires = 3600
451 #beaker.session.cookie_expires = 3600
394
452
395 ###################################
453 ; #############################
396 ## SEARCH INDEXING CONFIGURATION ##
454 ; SEARCH INDEXING CONFIGURATION
397 ###################################
455 ; #############################
398 ## Full text search indexer is available in rhodecode-tools under
399 ## `rhodecode-tools index` command
400
456
401 ## WHOOSH Backend, doesn't require additional services to run
457 ; Full text search indexer is available in rhodecode-tools under
402 ## it works good with few dozen repos
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 search.module = rhodecode.lib.index.whoosh
462 search.module = rhodecode.lib.index.whoosh
404 search.location = %(here)s/data/index
463 search.location = %(here)s/data/index
405
464
406 ########################################
465 ; ####################
407 ### CHANNELSTREAM CONFIG ####
466 ; CHANNELSTREAM CONFIG
408 ########################################
467 ; ####################
409 ## channelstream enables persistent connections and live notification
468
410 ## in the system. It's also used by the chat system
469 ; channelstream enables persistent connections and live notification
470 ; in the system. It's also used by the chat system
411
471
412 channelstream.enabled = false
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 channelstream.server = 127.0.0.1:9800
475 channelstream.server = 127.0.0.1:9800
416
476
417 ## location of the channelstream server from outside world
477 ; location of the channelstream server from outside world
418 ## use ws:// for http or wss:// for https. This address needs to be handled
478 ; use ws:// for http or wss:// for https. This address needs to be handled
419 ## by external HTTP server such as Nginx or Apache
479 ; by external HTTP server such as Nginx or Apache
420 ## see Nginx/Apache configuration examples in our docs
480 ; see Nginx/Apache configuration examples in our docs
421 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
481 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
422 channelstream.secret = secret
482 channelstream.secret = secret
423 channelstream.history.location = %(here)s/channelstream_history
483 channelstream.history.location = %(here)s/channelstream_history
424
484
425 ## Internal application path that Javascript uses to connect into.
485 ; Internal application path that Javascript uses to connect into.
426 ## If you use proxy-prefix the prefix should be added before /_channelstream
486 ; If you use proxy-prefix the prefix should be added before /_channelstream
427 channelstream.proxy_path = /_channelstream
487 channelstream.proxy_path = /_channelstream
428
488
429
489
430 ###################################
490 ; ##############################
431 ## APPENLIGHT CONFIG ##
491 ; MAIN RHODECODE DATABASE CONFIG
432 ###################################
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
563 ; ####################################################
435 ## http://appenlight.com for details how to obtain an account
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 appenlight = false
644 appenlight = false
439
645
440 appenlight.server_url = https://api.appenlight.com
646 appenlight.server_url = https://api.appenlight.com
441 appenlight.api_key = YOUR_API_KEY
647 appenlight.api_key = YOUR_API_KEY
442 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
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 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
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 appenlight.report_404 = false
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 appenlight.slow_request_time = 1
659 appenlight.slow_request_time = 1
454
660
455 ## record slow requests in application
661 ; record slow requests in application
456 ## (needs to be enabled for slow datastore recording and time tracking)
662 ; (needs to be enabled for slow datastore recording and time tracking)
457 appenlight.slow_requests = true
663 appenlight.slow_requests = true
458
664
459 ## enable hooking to application loggers
665 ; enable hooking to application loggers
460 appenlight.logging = true
666 appenlight.logging = true
461
667
462 ## minimum log level for log capture
668 ; minimum log level for log capture
463 appenlight.logging.level = WARNING
669 appenlight.logging.level = WARNING
464
670
465 ## send logs only from erroneous/slow requests
671 ; send logs only from erroneous/slow requests
466 ## (saves API quota for intensive logging)
672 ; (saves API quota for intensive logging)
467 appenlight.logging_on_error = false
673 appenlight.logging_on_error = false
468
674
469 ## list of additional keywords that should be grabbed from environ object
675 ; list of additional keywords that should be grabbed from environ object
470 ## can be string with comma separated list of words in lowercase
676 ; can be string with comma separated list of words in lowercase
471 ## (by default client will always send following info:
677 ; (by default client will always send following info:
472 ## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
678 ; 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
473 ## start with HTTP* this list be extended with additional keywords here
679 ; start with HTTP* this list be extended with additional keywords here
474 appenlight.environ_keys_whitelist =
680 appenlight.environ_keys_whitelist =
475
681
476 ## list of keywords that should be blanked from request object
682 ; list of keywords that should be blanked from request object
477 ## can be string with comma separated list of words in lowercase
683 ; can be string with comma separated list of words in lowercase
478 ## (by default client will always blank keys that contain following words
684 ; (by default client will always blank keys that contain following words
479 ## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
685 ; 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
480 ## this list be extended with additional keywords set here
686 ; this list be extended with additional keywords set here
481 appenlight.request_keys_blacklist =
687 appenlight.request_keys_blacklist =
482
688
483 ## list of namespaces that should be ignores when gathering log entries
689 ; list of namespaces that should be ignores when gathering log entries
484 ## can be string with comma separated list of namespaces
690 ; can be string with comma separated list of namespaces
485 ## (by default the client ignores own entries: appenlight_client.client)
691 ; (by default the client ignores own entries: appenlight_client.client)
486 appenlight.log_namespace_blacklist =
692 appenlight.log_namespace_blacklist =
487
693
488
694 ; Dummy marker to add new entries after.
489 ###########################################
695 ; Add any custom entries below. Please don't remove this marker.
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.
626 custom.conf = 1
696 custom.conf = 1
627
697
628
698
629 ################################
699 ; #####################
630 ### LOGGING CONFIGURATION ####
700 ; LOGGING CONFIGURATION
631 ################################
701 ; #####################
632 [loggers]
702 [loggers]
633 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
703 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
634
704
635 [handlers]
705 [handlers]
636 keys = console, console_sql
706 keys = console, console_sql
637
707
638 [formatters]
708 [formatters]
639 keys = generic, color_formatter, color_formatter_sql
709 keys = generic, color_formatter, color_formatter_sql
640
710
641 #############
711 ; #######
642 ## LOGGERS ##
712 ; LOGGERS
643 #############
713 ; #######
644 [logger_root]
714 [logger_root]
645 level = NOTSET
715 level = NOTSET
646 handlers = console
716 handlers = console
647
717
648 [logger_sqlalchemy]
718 [logger_sqlalchemy]
649 level = INFO
719 level = INFO
650 handlers = console_sql
720 handlers = console_sql
651 qualname = sqlalchemy.engine
721 qualname = sqlalchemy.engine
652 propagate = 0
722 propagate = 0
653
723
654 [logger_beaker]
724 [logger_beaker]
655 level = DEBUG
725 level = DEBUG
656 handlers =
726 handlers =
657 qualname = beaker.container
727 qualname = beaker.container
658 propagate = 1
728 propagate = 1
659
729
660 [logger_rhodecode]
730 [logger_rhodecode]
661 level = DEBUG
731 level = DEBUG
662 handlers =
732 handlers =
663 qualname = rhodecode
733 qualname = rhodecode
664 propagate = 1
734 propagate = 1
665
735
666 [logger_ssh_wrapper]
736 [logger_ssh_wrapper]
667 level = DEBUG
737 level = DEBUG
668 handlers =
738 handlers =
669 qualname = ssh_wrapper
739 qualname = ssh_wrapper
670 propagate = 1
740 propagate = 1
671
741
672 [logger_celery]
742 [logger_celery]
673 level = DEBUG
743 level = DEBUG
674 handlers =
744 handlers =
675 qualname = celery
745 qualname = celery
676
746
677
747
678 ##############
748 ; ########
679 ## HANDLERS ##
749 ; HANDLERS
680 ##############
750 ; ########
681
751
682 [handler_console]
752 [handler_console]
683 class = StreamHandler
753 class = StreamHandler
684 args = (sys.stderr, )
754 args = (sys.stderr, )
685 level = INFO
755 level = INFO
686 formatter = generic
756 formatter = generic
687
757
688 [handler_console_sql]
758 [handler_console_sql]
689 # "level = DEBUG" logs SQL queries and results.
759 ; "level = DEBUG" logs SQL queries and results.
690 # "level = INFO" logs SQL queries.
760 ; "level = INFO" logs SQL queries.
691 # "level = WARN" logs neither. (Recommended for production systems.)
761 ; "level = WARN" logs neither. (Recommended for production systems.)
692 class = StreamHandler
762 class = StreamHandler
693 args = (sys.stderr, )
763 args = (sys.stderr, )
694 level = WARN
764 level = WARN
695 formatter = generic
765 formatter = generic
696
766
697 ################
767 ; ##########
698 ## FORMATTERS ##
768 ; FORMATTERS
699 ################
769 ; ##########
700
770
701 [formatter_generic]
771 [formatter_generic]
702 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
772 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
703 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
773 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
704 datefmt = %Y-%m-%d %H:%M:%S
774 datefmt = %Y-%m-%d %H:%M:%S
705
775
706 [formatter_color_formatter]
776 [formatter_color_formatter]
707 class = rhodecode.lib.logging_formatter.ColorFormatter
777 class = rhodecode.lib.logging_formatter.ColorFormatter
708 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
778 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
709 datefmt = %Y-%m-%d %H:%M:%S
779 datefmt = %Y-%m-%d %H:%M:%S
710
780
711 [formatter_color_formatter_sql]
781 [formatter_color_formatter_sql]
712 class = rhodecode.lib.logging_formatter.ColorFormatterSql
782 class = rhodecode.lib.logging_formatter.ColorFormatterSql
713 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
783 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
714 datefmt = %Y-%m-%d %H:%M:%S
784 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,296 +1,296 b''
1 # Nix environment for the community edition
1 # Nix environment for the community edition
2 #
2 #
3 # This shall be as lean as possible, just producing the enterprise-ce
3 # This shall be as lean as possible, just producing the enterprise-ce
4 # derivation. For advanced tweaks to pimp up the development environment we use
4 # derivation. For advanced tweaks to pimp up the development environment we use
5 # "shell.nix" so that it does not have to clutter this file.
5 # "shell.nix" so that it does not have to clutter this file.
6 #
6 #
7 # Configuration, set values in "~/.nixpkgs/config.nix".
7 # Configuration, set values in "~/.nixpkgs/config.nix".
8 # example
8 # example
9 # {
9 # {
10 # # Thoughts on how to configure the dev environment
10 # # Thoughts on how to configure the dev environment
11 # rc = {
11 # rc = {
12 # codeInternalUrl = "https://usr:token@code.rhodecode.com/internal";
12 # codeInternalUrl = "https://usr:token@code.rhodecode.com/internal";
13 # sources = {
13 # sources = {
14 # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver";
14 # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver";
15 # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce";
15 # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce";
16 # rhodecode-enterprise-ee = "/home/user/work/rhodecode-enterprise-ee";
16 # rhodecode-enterprise-ee = "/home/user/work/rhodecode-enterprise-ee";
17 # };
17 # };
18 # };
18 # };
19 # }
19 # }
20
20
21 args@
21 args@
22 { system ? builtins.currentSystem
22 { system ? builtins.currentSystem
23 , pythonPackages ? "python27Packages"
23 , pythonPackages ? "python27Packages"
24 , pythonExternalOverrides ? self: super: {}
24 , pythonExternalOverrides ? self: super: {}
25 , doCheck ? false
25 , doCheck ? false
26 , ...
26 , ...
27 }:
27 }:
28
28
29 let
29 let
30 pkgs_ = args.pkgs or (import <nixpkgs> { inherit system; });
30 pkgs_ = args.pkgs or (import <nixpkgs> { inherit system; });
31 in
31 in
32
32
33 let
33 let
34 pkgs = import <nixpkgs> {
34 pkgs = import <nixpkgs> {
35 overlays = [
35 overlays = [
36 (import ./pkgs/overlays.nix)
36 (import ./pkgs/overlays.nix)
37 ];
37 ];
38 inherit
38 inherit
39 (pkgs_)
39 (pkgs_)
40 system;
40 system;
41 };
41 };
42
42
43 # Works with the new python-packages, still can fallback to the old
43 # Works with the new python-packages, still can fallback to the old
44 # variant.
44 # variant.
45 basePythonPackagesUnfix = basePythonPackages.__unfix__ or (
45 basePythonPackagesUnfix = basePythonPackages.__unfix__ or (
46 self: basePythonPackages.override (a: { inherit self; }));
46 self: basePythonPackages.override (a: { inherit self; }));
47
47
48 # Evaluates to the last segment of a file system path.
48 # Evaluates to the last segment of a file system path.
49 basename = path: with pkgs.lib; last (splitString "/" path);
49 basename = path: with pkgs.lib; last (splitString "/" path);
50
50
51 # source code filter used as arugment to builtins.filterSource.
51 # source code filter used as arugment to builtins.filterSource.
52 src-filter = path: type: with pkgs.lib;
52 src-filter = path: type: with pkgs.lib;
53 let
53 let
54 ext = last (splitString "." path);
54 ext = last (splitString "." path);
55 in
55 in
56 !builtins.elem (basename path) [
56 !builtins.elem (basename path) [
57 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
57 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
58 "node_modules" "node_binaries"
58 "node_modules" "node_binaries"
59 "build" "data" "result" "tmp"] &&
59 "build" "data" "result" "tmp"] &&
60 !builtins.elem ext ["egg-info" "pyc"] &&
60 !builtins.elem ext ["egg-info" "pyc"] &&
61 # TODO: johbo: This check is wrong, since "path" contains an absolute path,
61 # TODO: johbo: This check is wrong, since "path" contains an absolute path,
62 # it would still be good to restore it since we want to ignore "result-*".
62 # it would still be good to restore it since we want to ignore "result-*".
63 !hasPrefix "result" path;
63 !hasPrefix "result" path;
64
64
65 sources =
65 sources =
66 let
66 let
67 inherit
67 inherit
68 (pkgs.lib)
68 (pkgs.lib)
69 all
69 all
70 isString
70 isString
71 attrValues;
71 attrValues;
72 sourcesConfig = pkgs.config.rc.sources or {};
72 sourcesConfig = pkgs.config.rc.sources or {};
73 in
73 in
74 # Ensure that sources are configured as strings. Using a path
74 # Ensure that sources are configured as strings. Using a path
75 # would result in a copy into the nix store.
75 # would result in a copy into the nix store.
76 assert all isString (attrValues sourcesConfig);
76 assert all isString (attrValues sourcesConfig);
77 sourcesConfig;
77 sourcesConfig;
78
78
79 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
79 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
80 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
80 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
81
81
82 nodeEnv = import ./pkgs/node-default.nix {
82 nodeEnv = import ./pkgs/node-default.nix {
83 inherit
83 inherit
84 pkgs
84 pkgs
85 system;
85 system;
86 };
86 };
87 nodeDependencies = nodeEnv.shell.nodeDependencies;
87 nodeDependencies = nodeEnv.shell.nodeDependencies;
88
88
89 rhodecode-testdata-src = sources.rhodecode-testdata or (
89 rhodecode-testdata-src = sources.rhodecode-testdata or (
90 pkgs.fetchhg {
90 pkgs.fetchhg {
91 url = "https://code.rhodecode.com/upstream/rc_testdata";
91 url = "https://code.rhodecode.com/upstream/rc_testdata";
92 rev = "v0.10.0";
92 rev = "v0.10.0";
93 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
93 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
94 });
94 });
95
95
96 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
96 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
97 inherit
97 inherit
98 doCheck
98 doCheck
99 pkgs
99 pkgs
100 pythonPackages;
100 pythonPackages;
101 };
101 };
102
102
103 pythonLocalOverrides = self: super: {
103 pythonLocalOverrides = self: super: {
104 rhodecode-enterprise-ce =
104 rhodecode-enterprise-ce =
105 let
105 let
106 linkNodePackages = ''
106 linkNodePackages = ''
107 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
107 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
108
108
109 echo "[BEGIN]: Link node packages and binaries"
109 echo "[BEGIN]: Link node packages and binaries"
110 # johbo: Linking individual packages allows us to run "npm install"
110 # johbo: Linking individual packages allows us to run "npm install"
111 # inside of a shell to try things out. Re-entering the shell will
111 # inside of a shell to try things out. Re-entering the shell will
112 # restore a clean environment.
112 # restore a clean environment.
113 rm -fr node_modules
113 rm -fr node_modules
114 mkdir node_modules
114 mkdir node_modules
115 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
115 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
116 export NODE_PATH=./node_modules
116 export NODE_PATH=./node_modules
117
117
118 rm -fr node_binaries
118 rm -fr node_binaries
119 mkdir node_binaries
119 mkdir node_binaries
120 ln -s ${nodeDependencies}/bin/* node_binaries/
120 ln -s ${nodeDependencies}/bin/* node_binaries/
121 echo "[DONE ]: Link node packages and binaries"
121 echo "[DONE ]: Link node packages and binaries"
122 '';
122 '';
123
123
124 releaseName = "RhodeCodeEnterpriseCE-${version}";
124 releaseName = "RhodeCodeEnterpriseCE-${version}";
125 in super.rhodecode-enterprise-ce.override (attrs: {
125 in super.rhodecode-enterprise-ce.override (attrs: {
126 inherit
126 inherit
127 doCheck
127 doCheck
128 version;
128 version;
129
129
130 name = "rhodecode-enterprise-ce-${version}";
130 name = "rhodecode-enterprise-ce-${version}";
131 releaseName = releaseName;
131 releaseName = releaseName;
132 src = rhodecode-enterprise-ce-src;
132 src = rhodecode-enterprise-ce-src;
133 dontStrip = true; # prevent strip, we don't need it.
133 dontStrip = true; # prevent strip, we don't need it.
134
134
135 # expose following attributed outside
135 # expose following attributed outside
136 passthru = {
136 passthru = {
137 inherit
137 inherit
138 rhodecode-testdata
138 rhodecode-testdata
139 linkNodePackages
139 linkNodePackages
140 myPythonPackagesUnfix
140 myPythonPackagesUnfix
141 pythonLocalOverrides
141 pythonLocalOverrides
142 pythonCommunityOverrides;
142 pythonCommunityOverrides;
143
143
144 pythonPackages = self;
144 pythonPackages = self;
145 };
145 };
146
146
147 buildInputs =
147 buildInputs =
148 attrs.buildInputs or [] ++ [
148 attrs.buildInputs or [] ++ [
149 rhodecode-testdata
149 rhodecode-testdata
150 ];
150 ];
151
151
152 #NOTE: option to inject additional propagatedBuildInputs
152 #NOTE: option to inject additional propagatedBuildInputs
153 propagatedBuildInputs =
153 propagatedBuildInputs =
154 attrs.propagatedBuildInputs or [] ++ [
154 attrs.propagatedBuildInputs or [] ++ [
155
155
156 ];
156 ];
157
157
158 LC_ALL = "en_US.UTF-8";
158 LC_ALL = "en_US.UTF-8";
159 LOCALE_ARCHIVE =
159 LOCALE_ARCHIVE =
160 if pkgs.stdenv.isLinux
160 if pkgs.stdenv.isLinux
161 then "${pkgs.glibcLocales}/lib/locale/locale-archive"
161 then "${pkgs.glibcLocales}/lib/locale/locale-archive"
162 else "";
162 else "";
163
163
164 # Add bin directory to path so that tests can find 'rhodecode'.
164 # Add bin directory to path so that tests can find 'rhodecode'.
165 preCheck = ''
165 preCheck = ''
166 export PATH="$out/bin:$PATH"
166 export PATH="$out/bin:$PATH"
167 '';
167 '';
168
168
169 # custom check phase for testing
169 # custom check phase for testing
170 checkPhase = ''
170 checkPhase = ''
171 runHook preCheck
171 runHook preCheck
172 PYTHONHASHSEED=random py.test -vv -p no:sugar -r xw --cov-config=.coveragerc --cov=rhodecode --cov-report=term-missing rhodecode
172 PYTHONHASHSEED=random py.test -vv -p no:sugar -r xw --cov-config=.coveragerc --cov=rhodecode --cov-report=term-missing rhodecode
173 runHook postCheck
173 runHook postCheck
174 '';
174 '';
175
175
176 postCheck = ''
176 postCheck = ''
177 echo "Cleanup of rhodecode/tests"
177 echo "Cleanup of rhodecode/tests"
178 rm -rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/tests
178 rm -rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/tests
179 '';
179 '';
180
180
181 preBuild = ''
181 preBuild = ''
182 echo "[BEGIN]: Building frontend assets"
182 echo "[BEGIN]: Building frontend assets"
183 ${linkNodePackages}
183 ${linkNodePackages}
184 make web-build
184 make web-build
185 rm -fr node_modules
185 rm -fr node_modules
186 rm -fr node_binaries
186 rm -fr node_binaries
187 echo "[DONE ]: Building frontend assets"
187 echo "[DONE ]: Building frontend assets"
188 '';
188 '';
189
189
190 postInstall = ''
190 postInstall = ''
191 # check required files
191 # check required files
192 STATIC_CHECK="/robots.txt /502.html
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 /css/style.css /css/style-polymer.css /css/style-ipython.css"
194 /css/style.css /css/style-polymer.css /css/style-ipython.css"
195
195
196 for file in $STATIC_CHECK;
196 for file in $STATIC_CHECK;
197 do
197 do
198 if [ ! -f rhodecode/public/$file ]; then
198 if [ ! -f rhodecode/public/$file ]; then
199 echo "Missing $file"
199 echo "Missing $file"
200 exit 1
200 exit 1
201 fi
201 fi
202 done
202 done
203
203
204 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
204 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
205 mkdir -p $out/nix-support/rccontrol
205 mkdir -p $out/nix-support/rccontrol
206 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
206 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
207 echo "[DONE ]: enterprise-ce meta information for rccontrol written"
207 echo "[DONE ]: enterprise-ce meta information for rccontrol written"
208
208
209 mkdir -p $out/etc
209 mkdir -p $out/etc
210 cp configs/production.ini $out/etc
210 cp configs/production.ini $out/etc
211 echo "[DONE ]: saved enterprise-ce production.ini into $out/etc"
211 echo "[DONE ]: saved enterprise-ce production.ini into $out/etc"
212
212
213 cp -Rf rhodecode/config/rcextensions $out/etc/rcextensions.tmpl
213 cp -Rf rhodecode/config/rcextensions $out/etc/rcextensions.tmpl
214 echo "[DONE ]: saved enterprise-ce rcextensions into $out/etc/rcextensions.tmpl"
214 echo "[DONE ]: saved enterprise-ce rcextensions into $out/etc/rcextensions.tmpl"
215
215
216 # python based programs need to be wrapped
216 # python based programs need to be wrapped
217 mkdir -p $out/bin
217 mkdir -p $out/bin
218
218
219 # required binaries from dependencies
219 # required binaries from dependencies
220 ln -s ${self.supervisor}/bin/supervisorctl $out/bin/
220 ln -s ${self.supervisor}/bin/supervisorctl $out/bin/
221 ln -s ${self.supervisor}/bin/supervisord $out/bin/
221 ln -s ${self.supervisor}/bin/supervisord $out/bin/
222 ln -s ${self.pastescript}/bin/paster $out/bin/
222 ln -s ${self.pastescript}/bin/paster $out/bin/
223 ln -s ${self.channelstream}/bin/channelstream $out/bin/
223 ln -s ${self.channelstream}/bin/channelstream $out/bin/
224 ln -s ${self.celery}/bin/celery $out/bin/
224 ln -s ${self.celery}/bin/celery $out/bin/
225 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
225 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
226 ln -s ${self.pyramid}/bin/prequest $out/bin/
226 ln -s ${self.pyramid}/bin/prequest $out/bin/
227 ln -s ${self.pyramid}/bin/pserve $out/bin/
227 ln -s ${self.pyramid}/bin/pserve $out/bin/
228
228
229 echo "[DONE ]: created symlinks into $out/bin"
229 echo "[DONE ]: created symlinks into $out/bin"
230 DEPS="$out/bin/supervisorctl \
230 DEPS="$out/bin/supervisorctl \
231 $out/bin/supervisord \
231 $out/bin/supervisord \
232 $out/bin/paster \
232 $out/bin/paster \
233 $out/bin/channelstream \
233 $out/bin/channelstream \
234 $out/bin/celery \
234 $out/bin/celery \
235 $out/bin/gunicorn \
235 $out/bin/gunicorn \
236 $out/bin/prequest \
236 $out/bin/prequest \
237 $out/bin/pserve"
237 $out/bin/pserve"
238
238
239 # wrap only dependency scripts, they require to have full PYTHONPATH set
239 # wrap only dependency scripts, they require to have full PYTHONPATH set
240 # to be able to import all packages
240 # to be able to import all packages
241 for file in $DEPS;
241 for file in $DEPS;
242 do
242 do
243 wrapProgram $file \
243 wrapProgram $file \
244 --prefix PATH : $PATH \
244 --prefix PATH : $PATH \
245 --prefix PYTHONPATH : $PYTHONPATH \
245 --prefix PYTHONPATH : $PYTHONPATH \
246 --set PYTHONHASHSEED random
246 --set PYTHONHASHSEED random
247 done
247 done
248
248
249 echo "[DONE ]: enterprise-ce binary wrapping"
249 echo "[DONE ]: enterprise-ce binary wrapping"
250
250
251 # rhodecode-tools don't need wrapping
251 # rhodecode-tools don't need wrapping
252 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
252 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
253
253
254 # expose sources of CE
254 # expose sources of CE
255 ln -s $out $out/etc/rhodecode_enterprise_ce_source
255 ln -s $out $out/etc/rhodecode_enterprise_ce_source
256
256
257 # expose static files folder
257 # expose static files folder
258 cp -Rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/public/ $out/etc/static
258 cp -Rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/public/ $out/etc/static
259 chmod 755 -R $out/etc/static
259 chmod 755 -R $out/etc/static
260
260
261 '';
261 '';
262 });
262 });
263
263
264 };
264 };
265
265
266 basePythonPackages = with builtins;
266 basePythonPackages = with builtins;
267 if isAttrs pythonPackages then
267 if isAttrs pythonPackages then
268 pythonPackages
268 pythonPackages
269 else
269 else
270 getAttr pythonPackages pkgs;
270 getAttr pythonPackages pkgs;
271
271
272 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
272 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
273 inherit
273 inherit
274 pkgs;
274 pkgs;
275 inherit
275 inherit
276 (pkgs)
276 (pkgs)
277 fetchurl
277 fetchurl
278 fetchgit
278 fetchgit
279 fetchhg;
279 fetchhg;
280 };
280 };
281
281
282 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
282 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
283 inherit pkgs basePythonPackages;
283 inherit pkgs basePythonPackages;
284 };
284 };
285
285
286 # Apply all overrides and fix the final package set
286 # Apply all overrides and fix the final package set
287 myPythonPackagesUnfix = with pkgs.lib;
287 myPythonPackagesUnfix = with pkgs.lib;
288 (extends pythonExternalOverrides
288 (extends pythonExternalOverrides
289 (extends pythonLocalOverrides
289 (extends pythonLocalOverrides
290 (extends pythonCommunityOverrides
290 (extends pythonCommunityOverrides
291 (extends pythonGeneratedPackages
291 (extends pythonGeneratedPackages
292 basePythonPackagesUnfix))));
292 basePythonPackagesUnfix))));
293
293
294 myPythonPackages = (pkgs.lib.fix myPythonPackagesUnfix);
294 myPythonPackages = (pkgs.lib.fix myPythonPackagesUnfix);
295
295
296 in myPythonPackages.rhodecode-enterprise-ce
296 in myPythonPackages.rhodecode-enterprise-ce
@@ -1,24 +1,61 b''
1 .. _repo-admin-tasks:
1 .. _repo-admin-tasks:
2
2
3 Common Admin Tasks for Repositories
3 Common Admin Tasks for Repositories
4 -----------------------------------
4 -----------------------------------
5
5
6
6
7 Manually Force Delete Repository
7 Manually Force Delete Repository
8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9
9
10 In case of attached forks or pull-requests repositories should be archived.
10 In case of attached forks or pull-requests repositories should be archived.
11 Here is how to force delete a repository and remove all dependent objects
11 Here is how to force delete a repository and remove all dependent objects
12
12
13
13
14 .. code-block:: bash
14 .. code-block:: bash
15 :dedent: 1
15
16
16 # starts the ishell interactive prompt
17 # starts the ishell interactive prompt
17 $ rccontrol ishell enterprise-1
18 $ rccontrol ishell enterprise-1
18
19
19 .. code-block:: python
20 .. code-block:: python
21 :dedent: 1
20
22
21 In [4]: from rhodecode.model.repo import RepoModel
23 In [4]: from rhodecode.model.repo import RepoModel
22 In [3]: repo = Repository.get_by_repo_name('test_repos/repo_with_prs')
24 In [3]: repo = Repository.get_by_repo_name('test_repos/repo_with_prs')
23 In [5]: RepoModel().delete(repo, forks='detach', pull_requests='delete')
25 In [5]: RepoModel().delete(repo, forks='detach', pull_requests='delete')
24 In [6]: Session().commit()
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 Nginx Configuration Example
1 Nginx Configuration Example
2 ---------------------------
2 ---------------------------
3
3
4 Use the following example to configure Nginx as a your web server.
4 Use the following example to configure Nginx as a your web server.
5
5
6
6
7 .. code-block:: nginx
7 .. code-block:: nginx
8
8
9 ## Rate limiter for certain pages to prevent brute force attacks
9 ## Rate limiter for certain pages to prevent brute force attacks
10 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
10 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
11
11
12 ## cache zone
12 ## cache zone
13 proxy_cache_path /etc/nginx/nginx_cache levels=1:2 use_temp_path=off keys_zone=cache_zone:10m inactive=720h max_size=10g;
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 ## Custom log format
15 ## Custom log format
16 log_format log_custom '$remote_addr - $remote_user [$time_local] '
16 log_format log_custom '$remote_addr - $remote_user [$time_local] '
17 '"$request" $status $body_bytes_sent '
17 '"$request" $status $body_bytes_sent '
18 '"$http_referer" "$http_user_agent" '
18 '"$http_referer" "$http_user_agent" '
19 '$request_time $upstream_response_time $pipe';
19 '$request_time $upstream_response_time $pipe';
20
20
21 ## Define one or more upstreams (local RhodeCode instance) to connect to
21 ## Define one or more upstreams (local RhodeCode instance) to connect to
22 upstream rc {
22 upstream rc {
23 # Url to running RhodeCode instance.
23 # Url to running RhodeCode instance.
24 # This is shown as `- URL: <host>` in output from rccontrol status.
24 # This is shown as `- URL: <host>` in output from rccontrol status.
25 server 127.0.0.1:10002;
25 server 127.0.0.1:10002;
26
26
27 # add more instances for load balancing
27 # add more instances for load balancing
28 # server 127.0.0.1:10003;
28 # server 127.0.0.1:10003;
29 # server 127.0.0.1:10004;
29 # server 127.0.0.1:10004;
30 }
30 }
31
31
32 ## HTTP to HTTPS rewrite
32 ## HTTP to HTTPS rewrite
33 server {
33 server {
34 listen 80;
34 listen 80;
35 server_name rhodecode.myserver.com;
35 server_name rhodecode.myserver.com;
36
36
37 if ($http_host = rhodecode.myserver.com) {
37 if ($http_host = rhodecode.myserver.com) {
38 rewrite (.*) https://rhodecode.myserver.com$1 permanent;
38 rewrite (.*) https://rhodecode.myserver.com$1 permanent;
39 }
39 }
40 }
40 }
41
41
42 ## Optional gist alias server, for serving nicer GIST urls.
42 ## Optional gist alias server, for serving nicer GIST urls.
43 server {
43 server {
44 listen 443;
44 listen 443;
45 server_name gist.myserver.com;
45 server_name gist.myserver.com;
46 access_log /var/log/nginx/gist.access.log log_custom;
46 access_log /var/log/nginx/gist.access.log log_custom;
47 error_log /var/log/nginx/gist.error.log;
47 error_log /var/log/nginx/gist.error.log;
48
48
49 ssl on;
49 ssl on;
50 ssl_certificate gist.rhodecode.myserver.com.crt;
50 ssl_certificate gist.rhodecode.myserver.com.crt;
51 ssl_certificate_key gist.rhodecode.myserver.com.key;
51 ssl_certificate_key gist.rhodecode.myserver.com.key;
52
52
53 ssl_session_timeout 5m;
53 ssl_session_timeout 5m;
54
54
55 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
55 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
56 ssl_prefer_server_ciphers on;
56 ssl_prefer_server_ciphers on;
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';
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 ## Strict http prevents from https -> http downgrade
59 ## Strict http prevents from https -> http downgrade
60 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
60 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
61
61
62 ## Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
62 ## Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
63 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
63 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
64
64
65 rewrite ^/(.+)$ https://rhodecode.myserver.com/_admin/gists/$1;
65 rewrite ^/(.+)$ https://rhodecode.myserver.com/_admin/gists/$1;
66 rewrite (.*) https://rhodecode.myserver.com/_admin/gists;
66 rewrite (.*) https://rhodecode.myserver.com/_admin/gists;
67 }
67 }
68
68
69
69
70 ## MAIN SSL enabled server
70 ## MAIN SSL enabled server
71 server {
71 server {
72 listen 443 ssl http2;
72 listen 443 ssl http2;
73 server_name rhodecode.myserver.com;
73 server_name rhodecode.myserver.com;
74
74
75 access_log /var/log/nginx/rhodecode.access.log log_custom;
75 access_log /var/log/nginx/rhodecode.access.log log_custom;
76 error_log /var/log/nginx/rhodecode.error.log;
76 error_log /var/log/nginx/rhodecode.error.log;
77
77
78 ssl_certificate rhodecode.myserver.com.crt;
78 ssl_certificate rhodecode.myserver.com.crt;
79 ssl_certificate_key rhodecode.myserver.com.key;
79 ssl_certificate_key rhodecode.myserver.com.key;
80
80
81 # enable session resumption to improve https performance
81 # enable session resumption to improve https performance
82 # http://vincent.bernat.im/en/blog/2011-ssl-session-reuse-rfc5077.html
82 # http://vincent.bernat.im/en/blog/2011-ssl-session-reuse-rfc5077.html
83 ssl_session_cache shared:SSL:50m;
83 ssl_session_cache shared:SSL:50m;
84 ssl_session_timeout 5m;
84 ssl_session_timeout 5m;
85
85
86 ## Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
86 ## Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
87 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
87 #ssl_dhparam /etc/nginx/ssl/dhparam.pem;
88
88
89 # enables server-side protection from BEAST attacks
89 # enables server-side protection from BEAST attacks
90 # http://blog.ivanristic.com/2013/09/is-beast-still-a-threat.html
90 # http://blog.ivanristic.com/2013/09/is-beast-still-a-threat.html
91 ssl_prefer_server_ciphers on;
91 ssl_prefer_server_ciphers on;
92
92
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
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 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
94 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
95
95
96 # ciphers chosen for forward secrecy and compatibility
96 # ciphers chosen for forward secrecy and compatibility
97 # http://blog.ivanristic.com/2013/08/configuring-apache-nginx-and-openssl-for-forward-secrecy.html
97 # http://blog.ivanristic.com/2013/08/configuring-apache-nginx-and-openssl-for-forward-secrecy.html
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";
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 client_body_buffer_size 128k;
100 client_body_buffer_size 128k;
101 # maximum number and size of buffers for large headers to read from client request
101 # maximum number and size of buffers for large headers to read from client request
102 large_client_header_buffers 16 256k;
102 large_client_header_buffers 16 256k;
103
103
104 ## uncomment to serve static files by Nginx, recommended for performance
104 ## uncomment to serve static files by Nginx, recommended for performance
105 # location /_static/rhodecode {
105 # location /_static/rhodecode {
106 # gzip on;
106 # gzip on;
107 # gzip_min_length 500;
107 # gzip_min_length 500;
108 # gzip_proxied any;
108 # gzip_proxied any;
109 # gzip_comp_level 4;
109 # gzip_comp_level 4;
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;
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 # gzip_vary on;
111 # gzip_vary on;
112 # gzip_disable "msie6";
112 # gzip_disable "msie6";
113 # expires 60d;
113 # alias /path/to/.rccontrol/community-1/static;
114 # alias /path/to/.rccontrol/community-1/static;
114 # alias /path/to/.rccontrol/enterprise-1/static;
115 # alias /path/to/.rccontrol/enterprise-1/static;
115 # }
116 # }
116
117
117 ## channelstream location handler, if channelstream live chat and notifications
118 ## channelstream location handler, if channelstream live chat and notifications
118 ## are enable this will proxy the requests to channelstream websocket server
119 ## are enable this will proxy the requests to channelstream websocket server
119 location /_channelstream {
120 location /_channelstream {
120 rewrite /_channelstream/(.*) /$1 break;
121 rewrite /_channelstream/(.*) /$1 break;
121 gzip off;
122 gzip off;
122 tcp_nodelay off;
123 tcp_nodelay off;
123
124
124 proxy_connect_timeout 10;
125 proxy_connect_timeout 10;
125 proxy_send_timeout 10m;
126 proxy_send_timeout 10m;
126 proxy_read_timeout 10m;
127 proxy_read_timeout 10m;
127
128
128 proxy_set_header Host $host;
129 proxy_set_header Host $host;
129 proxy_set_header X-Real-IP $remote_addr;
130 proxy_set_header X-Real-IP $remote_addr;
130 proxy_set_header X-Url-Scheme $scheme;
131 proxy_set_header X-Url-Scheme $scheme;
131 proxy_set_header X-Forwarded-Proto $scheme;
132 proxy_set_header X-Forwarded-Proto $scheme;
132 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
133 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
133
134
134 proxy_http_version 1.1;
135 proxy_http_version 1.1;
135 proxy_set_header Upgrade $http_upgrade;
136 proxy_set_header Upgrade $http_upgrade;
136 proxy_set_header Connection "upgrade";
137 proxy_set_header Connection "upgrade";
137
138
138 proxy_pass http://127.0.0.1:9800;
139 proxy_pass http://127.0.0.1:9800;
139 }
140 }
140
141
141 ## rate limit this endpoint to prevent login page brute-force attacks
142 ## rate limit this endpoint to prevent login page brute-force attacks
142 location /_admin/login {
143 location /_admin/login {
143 limit_req zone=req_limit burst=10 nodelay;
144 limit_req zone=req_limit burst=10 nodelay;
144 try_files $uri @rhodecode_http;
145 try_files $uri @rhodecode_http;
145 }
146 }
146
147
147 ## Special Cache for file store, make sure you enable this intentionally as
148 ## Special Cache for file store, make sure you enable this intentionally as
148 ## it could bypass upload files permissions
149 ## it could bypass upload files permissions
149 # location /_file_store/download {
150 # location /_file_store/download {
150 #
151 #
151 # proxy_cache cache_zone;
152 # proxy_cache cache_zone;
152 # # ignore Set-Cookie
153 # # ignore Set-Cookie
153 # proxy_ignore_headers Set-Cookie;
154 # proxy_ignore_headers Set-Cookie;
154 # proxy_ignore_headers Cookie;
155 # proxy_ignore_headers Cookie;
155 #
156 #
156 # proxy_cache_key $host$uri$is_args$args;
157 # proxy_cache_key $host$uri$is_args$args;
157 # proxy_cache_methods GET;
158 # proxy_cache_methods GET;
158 #
159 #
159 # proxy_cache_bypass $http_cache_control;
160 # proxy_cache_bypass $http_cache_control;
160 # proxy_cache_valid 200 302 720h;
161 # proxy_cache_valid 200 302 720h;
161 #
162 #
162 # proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
163 # proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
163 #
164 #
164 # # returns cache status in headers
165 # # returns cache status in headers
165 # add_header X-Proxy-Cache $upstream_cache_status;
166 # add_header X-Proxy-Cache $upstream_cache_status;
166 # add_header Cache-Control "public";
167 # add_header Cache-Control "public";
167 #
168 #
168 # proxy_cache_lock on;
169 # proxy_cache_lock on;
169 # proxy_cache_lock_age 5m;
170 # proxy_cache_lock_age 5m;
170 #
171 #
171 # proxy_pass http://rc;
172 # proxy_pass http://rc;
172 #
173 #
173 # }
174 # }
174
175
175 location / {
176 location / {
176 try_files $uri @rhodecode_http;
177 try_files $uri @rhodecode_http;
177 }
178 }
178
179
179 location @rhodecode_http {
180 location @rhodecode_http {
180 # example of proxy.conf can be found in our docs.
181 # example of proxy.conf can be found in our docs.
181 include /etc/nginx/proxy.conf;
182 include /etc/nginx/proxy.conf;
182 proxy_pass http://rc;
183 proxy_pass http://rc;
183 }
184 }
184
185
185 ## Custom 502 error page.
186 ## Custom 502 error page.
186 ## Will be displayed while RhodeCode server is turned off
187 ## Will be displayed while RhodeCode server is turned off
187 error_page 502 /502.html;
188 error_page 502 /502.html;
188 location = /502.html {
189 location = /502.html {
189 #root /path/to/.rccontrol/community-1/static;
190 #root /path/to/.rccontrol/community-1/static;
190 root /path/to/.rccontrol/enterprise-1/static;
191 root /path/to/.rccontrol/enterprise-1/static;
191 }
192 }
192 } No newline at end of file
193 }
@@ -1,21 +1,22 b''
1 .. _rhodecode-tuning-ref:
1 .. _rhodecode-tuning-ref:
2
2
3 Tuning |RCE|
3 Tuning |RCE|
4 ============
4 ============
5
5
6 To customize your |RCE| |version| installation for maximum performance you
6 To customize your |RCE| |version| installation for maximum performance you
7 may find some of the following methods useful.
7 may find some of the following methods useful.
8
8
9 .. toctree::
9 .. toctree::
10
10
11 tuning/tuning-gunicorn
11 tuning/tuning-gunicorn
12 tuning/tuning-vcs-memory-cache
12 tuning/tuning-vcs-server-memory-usage
13 tuning/tuning-rhodecode-memory-usage
13 tuning/tuning-user-sessions-performance
14 tuning/tuning-user-sessions-performance
14 tuning/tuning-increase-db-performance
15 tuning/tuning-increase-db-performance
15 tuning/tuning-scale-horizontally-cluster
16 tuning/tuning-scale-horizontally-cluster
16 tuning/tuning-mount-cache-memory
17 tuning/tuning-mount-cache-memory
17 tuning/tuning-change-encoding
18 tuning/tuning-change-encoding
18 tuning/tuning-change-large-file-dir
19 tuning/tuning-change-large-file-dir
19 tuning/tuning-change-lfs-dir
20 tuning/tuning-change-lfs-dir
20 tuning/tuning-hg-auth-loop
21 tuning/tuning-hg-auth-loop
21
22
@@ -1,126 +1,118 b''
1 .. _increase-gunicorn:
1 .. _increase-gunicorn:
2
2
3 Configure Gunicorn Workers
3 Configure Gunicorn Workers
4 --------------------------
4 --------------------------
5
5
6
6
7 |RCE| comes with `Gunicorn`_ which is a Python WSGI HTTP Server for UNIX.
7 |RCE| comes with `Gunicorn`_ which is a Python WSGI HTTP Server for UNIX.
8
8
9 To improve |RCE| performance you can increase the number of `Gunicorn`_ workers.
9 To improve |RCE| performance you can increase the number of `Gunicorn`_ workers.
10 This allows to handle more connections concurrently, and provide better
10 This allows to handle more connections concurrently, and provide better
11 responsiveness and performance.
11 responsiveness and performance.
12
12
13 By default during installation |RCC| tries to detect how many CPUs are
13 By default during installation |RCC| tries to detect how many CPUs are
14 available in the system, and set the number workers based on that information.
14 available in the system, and set the number workers based on that information.
15 However sometimes it's better to manually set the number of workers.
15 However sometimes it's better to manually set the number of workers.
16
16
17 To do this, use the following steps:
17 To do this, use the following steps:
18
18
19 1. Open the :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
19 1. Open the :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
20 2. In the ``[server:main]`` section, change the number of Gunicorn
20 2. In the ``[server:main]`` section, change the number of Gunicorn
21 ``workers`` using the following default formula :math:`(2 * Cores) + 1`.
21 ``workers`` using the following default formula :math:`(2 * Cores) + 1`.
22 We however not recommend using more than 8-12 workers per server. It's better
22 We however not recommend using more than 8-12 workers per server. It's better
23 to start using the :ref:`scale-horizontal-cluster` in case that performance
23 to start using the :ref:`scale-horizontal-cluster` in case that performance
24 with 8-12 workers is not enough.
24 with 8-12 workers is not enough.
25
25
26 .. code-block:: ini
26 .. code-block:: ini
27
27
28 use = egg:gunicorn#main
28 ; Sets the number of process workers. More workers means more concurrent connections
29 ## Sets the number of process workers. You must set `instance_id = *`
29 ; RhodeCode can handle at the same time. Each additional worker also it increases
30 ## when this option is set to more than one worker, recommended
30 ; memory usage as each has it's own set of caches.
31 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
31 ; Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
32 ## The `instance_id = *` must be set in the [app:main] section below
32 ; than 8-10 unless for really big deployments .e.g 700-1000 users.
33 workers = 4
33 ; `instance_id = *` must be set in the [app:main] section below (which is the default)
34 ## process name
34 ; when using more than 1 worker.
35 proc_name = rhodecode
35 workers = 6
36 ## type of worker class, one of sync, gevent
36
37 ## recommended for bigger setup is using of of other than sync one
37 ; Type of worker class, one of `sync`, `gevent`
38 worker_class = sync
38 ; Use `gevent` for rhodecode
39 ## The maximum number of simultaneous clients. Valid only for Gevent
39 worker_class = gevent
40 #worker_connections = 10
40
41 ## max number of requests that worker will handle before being gracefully
41 ; The maximum number of simultaneous clients per worker. Valid only for gevent
42 ## restarted, could prevent memory leaks
42 worker_connections = 10
43 max_requests = 1000
43
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
48
44
49 3. In the ``[app:main]`` section, set the ``instance_id`` property to ``*``.
45 3. In the ``[app:main]`` section, set the ``instance_id`` property to ``*``.
50
46
51 .. code-block:: ini
47 .. code-block:: ini
52
48
53 # In the [app:main] section
49 # In the [app:main] section
54 [app:main]
50 [app:main]
55 # You must set `instance_id = *`
51 # You must set `instance_id = *`
56 instance_id = *
52 instance_id = *
57
53
58 4. Change the VCSServer workers too. Open the
54 4. Change the VCSServer workers too. Open the
59 :file:`home/{user}/.rccontrol/{instance-id}/vcsserver.ini` file.
55 :file:`home/{user}/.rccontrol/{instance-id}/vcsserver.ini` file.
60
56
61 5. In the ``[server:main]`` section, increase the number of Gunicorn
57 5. In the ``[server:main]`` section, increase the number of Gunicorn
62 ``workers`` using the following formula :math:`(2 * Cores) + 1`.
58 ``workers`` using the following formula :math:`(2 * Cores) + 1`.
63
59
64 .. code-block:: ini
60 .. code-block:: ini
65
61
66 ## run with gunicorn --log-config vcsserver.ini --paste vcsserver.ini
62 ; Sets the number of process workers. More workers means more concurrent connections
67 use = egg:gunicorn#main
63 ; RhodeCode can handle at the same time. Each additional worker also it increases
68 ## Sets the number of process workers. Recommended
64 ; memory usage as each has it's own set of caches.
69 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
65 ; Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
70 workers = 4
66 ; than 8-10 unless for really big deployments .e.g 700-1000 users.
71 ## process name
67 ; `instance_id = *` must be set in the [app:main] section below (which is the default)
72 proc_name = rhodecode_vcsserver
68 ; when using more than 1 worker.
73 ## type of worker class, currently `sync` is the only option allowed.
69 workers = 8
70
71 ; Type of worker class, one of `sync`, `gevent`
72 ; Use `sync` for vcsserver
74 worker_class = sync
73 worker_class = sync
75 ## The maximum number of simultaneous clients. Valid only for Gevent
74
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
84
75
85 6. Save your changes.
76 6. Save your changes.
86 7. Restart your |RCE| instances, using the following command:
77 7. Restart your |RCE| instances, using the following command:
87
78
88 .. code-block:: bash
79 .. code-block:: bash
89
80
90 $ rccontrol restart '*'
81 $ rccontrol restart '*'
91
82
92
83
93 Gunicorn Gevent Backend
84 Gunicorn Gevent Backend
94 -----------------------
85 -----------------------
95
86
96 Gevent is an asynchronous worker type for Gunicorn. It allows accepting multiple
87 Gevent is an asynchronous worker type for Gunicorn. It allows accepting multiple
97 connections on a single `Gunicorn`_ worker. This means you can handle 100s
88 connections on a single `Gunicorn`_ worker. This means you can handle 100s
98 of concurrent clones, or API calls using just few workers. A setting called
89 of concurrent clones, or API calls using just few workers. A setting called
99 `worker_connections` defines on how many connections each worker can
90 `worker_connections` defines on how many connections each worker can
100 handle using `Gevent`.
91 handle using `Gevent`.
101
92
102
93
103 To enable `Gevent` on |RCE| do the following:
94 To enable `Gevent` on |RCE| do the following:
104
95
105
96
106 1. Open the :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
97 1. Open the :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
107 2. In the ``[server:main]`` section, change `worker_class` for Gunicorn.
98 2. In the ``[server:main]`` section, change `worker_class` for Gunicorn.
108
99
109
100
110 .. code-block:: ini
101 .. code-block:: ini
111
102
112 ## type of worker class, one of sync, gevent
103 ; Type of worker class, one of `sync`, `gevent`
113 ## recommended for bigger setup is using of of other than sync one
104 ; Use `gevent` for rhodecode
114 worker_class = gevent
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 worker_connections = 30
108 worker_connections = 30
117
109
118
110
119 .. note::
111 .. note::
120
112
121 `Gevent` is currently only supported for Enterprise/Community instances.
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 .. _Gunicorn: http://gunicorn.org/
118 .. _Gunicorn: http://gunicorn.org/
@@ -1,395 +1,396 b''
1 .. _scale-horizontal-cluster:
1 .. _scale-horizontal-cluster:
2
2
3
3
4 Scale Horizontally / RhodeCode Cluster
4 Scale Horizontally / RhodeCode Cluster
5 --------------------------------------
5 --------------------------------------
6
6
7 |RCE| is built in a way it support horizontal scaling across multiple machines.
7 |RCE| is built in a way it support horizontal scaling across multiple machines.
8 There are three main pre-requisites for that:
8 There are three main pre-requisites for that:
9
9
10 - Shared storage that each machine can access. Using NFS or other shared storage system.
10 - Shared storage that each machine can access. Using NFS or other shared storage system.
11 - Shared DB connection across machines. Using `MySQL`/`PostgreSQL` that each node can access.
11 - Shared DB connection across machines. Using `MySQL`/`PostgreSQL` that each node can access.
12 - |RCE| user sessions and caches need to use a shared storage (e.g `Redis`_/`Memcached`)
12 - |RCE| user sessions and caches need to use a shared storage (e.g `Redis`_/`Memcached`)
13
13
14
14
15 Horizontal scaling means adding more machines or workers into your pool of
15 Horizontal scaling means adding more machines or workers into your pool of
16 resources. Horizontally scaling |RCE| gives a huge performance increase,
16 resources. Horizontally scaling |RCE| gives a huge performance increase,
17 especially under large traffic scenarios with a high number of requests.
17 especially under large traffic scenarios with a high number of requests.
18 This is very beneficial when |RCE| is serving many users simultaneously,
18 This is very beneficial when |RCE| is serving many users simultaneously,
19 or if continuous integration servers are automatically pulling and pushing code.
19 or if continuous integration servers are automatically pulling and pushing code.
20 It also adds High-Availability to your running system.
20 It also adds High-Availability to your running system.
21
21
22
22
23 Cluster Overview
23 Cluster Overview
24 ^^^^^^^^^^^^^^^^
24 ^^^^^^^^^^^^^^^^
25
25
26 Below we'll present a configuration example that will use two separate nodes to serve
26 Below we'll present a configuration example that will use two separate nodes to serve
27 |RCE| in a load-balanced environment. The 3rd node will act as a shared storage/cache
27 |RCE| in a load-balanced environment. The 3rd node will act as a shared storage/cache
28 and handle load-balancing. In addition 3rd node will be used as shared database instance.
28 and handle load-balancing. In addition 3rd node will be used as shared database instance.
29
29
30 This setup can be used both in Docker based configuration or with individual
30 This setup can be used both in Docker based configuration or with individual
31 physical/virtual machines. Using the 3rd node for Storage/Redis/PostgreSQL/Nginx is
31 physical/virtual machines. Using the 3rd node for Storage/Redis/PostgreSQL/Nginx is
32 optional. All those components can be installed on one of the two nodes used for |RCE|.
32 optional. All those components can be installed on one of the two nodes used for |RCE|.
33 We'll use following naming for our nodes:
33 We'll use following naming for our nodes:
34
34
35 - `rc-node-1` (NFS, DB, Cache node)
35 - `rc-node-1` (NFS, DB, Cache node)
36 - `rc-node-2` (Worker node1)
36 - `rc-node-2` (Worker node1)
37 - `rc-node-3` (Worker node2)
37 - `rc-node-3` (Worker node2)
38
38
39 Our shares NFS storage in the example is located on `/home/rcdev/storage` and
39 Our shares NFS storage in the example is located on `/home/rcdev/storage` and
40 it's RW accessible on **each** node.
40 it's RW accessible on **each** node.
41
41
42 In this example we used certain recommended components, however many
42 In this example we used certain recommended components, however many
43 of those can be replaced by other, in case your organization already uses them, for example:
43 of those can be replaced by other, in case your organization already uses them, for example:
44
44
45 - `MySQL`/`PostgreSQL`: Aren't replaceable and are the two only supported databases.
45 - `MySQL`/`PostgreSQL`: Aren't replaceable and are the two only supported databases.
46 - `Nginx`_ on `rc-node-1` can be replaced by: `Hardware Load Balancer (F5)`, `Apache`_, `HA-Proxy` etc.
46 - `Nginx`_ on `rc-node-1` can be replaced by: `Hardware Load Balancer (F5)`, `Apache`_, `HA-Proxy` etc.
47 - `Nginx`_ on rc-node-2/3 acts as a reverse proxy and can be replaced by other HTTP server
47 - `Nginx`_ on rc-node-2/3 acts as a reverse proxy and can be replaced by other HTTP server
48 acting as reverse proxy such as `Apache`_.
48 acting as reverse proxy such as `Apache`_.
49 - `Redis`_ on `rc-node-1` can be replaced by: `Memcached`
49 - `Redis`_ on `rc-node-1` can be replaced by: `Memcached`
50
50
51
51
52 Here's an overview what components should be installed/setup on each server in our example:
52 Here's an overview what components should be installed/setup on each server in our example:
53
53
54 - **rc-node-1**:
54 - **rc-node-1**:
55
55
56 - main storage acting as NFS host.
56 - main storage acting as NFS host.
57 - `nginx` acting as a load-balancer.
57 - `nginx` acting as a load-balancer.
58 - `postgresql-server` used for database and sessions.
58 - `postgresql-server` used for database and sessions.
59 - `redis-server` used for storing shared caches.
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 - optionally if `Celery` is used Enterprise/Community instance + VCSServer.
61 - optionally if `Celery` is used Enterprise/Community instance + VCSServer.
62 - optionally mailserver that can be shared by other instances.
62 - optionally mailserver that can be shared by other instances.
63 - optionally channelstream server to handle live communication for all instances.
63 - optionally channelstream server to handle live communication for all instances.
64
64
65
65
66 - **rc-node-2/3**:
66 - **rc-node-2/3**:
67
67
68 - `nginx` acting as a reverse proxy to handle requests to |RCE|.
68 - `nginx` acting as a reverse proxy to handle requests to |RCE|.
69 - 1x RhodeCode Enterprise/Community instance.
69 - 1x RhodeCode Enterprise/Community instance.
70 - 1x VCSServer instance.
70 - 1x VCSServer instance.
71 - optionally for testing connection: postgresql-client, redis-client (redis-tools).
71 - optionally for testing connection: postgresql-client, redis-client (redis-tools).
72
72
73
73
74 Before we start here are few assumptions that should be fulfilled:
74 Before we start here are few assumptions that should be fulfilled:
75
75
76 - make sure each node can access each other.
76 - make sure each node can access each other.
77 - make sure `Redis`_/`MySQL`/`PostgreSQL`/`RabbitMQ`_ are running on `rc-node-1`
77 - make sure `Redis`_/`MySQL`/`PostgreSQL`/`RabbitMQ`_ are running on `rc-node-1`
78 - make sure both `rc-node-2`/`3` can access NFS storage with RW access
78 - make sure both `rc-node-2`/`3` can access NFS storage with RW access
79 - make sure rc-node-2/3 can access `Redis`_/`PostgreSQL`, `MySQL` database on `rc-node-1`.
79 - make sure rc-node-2/3 can access `Redis`_/`PostgreSQL`, `MySQL` database on `rc-node-1`.
80 - make sure `Redis`_/Database/`RabbitMQ`_ are password protected and accessible only from rc-node-2/3.
80 - make sure `Redis`_/Database/`RabbitMQ`_ are password protected and accessible only from rc-node-2/3.
81
81
82
82
83
83
84 Setup rc-node-2/3
84 Setup rc-node-2/3
85 ^^^^^^^^^^^^^^^^^
85 ^^^^^^^^^^^^^^^^^
86
86
87 Initially before `rc-node-1` we'll configure both nodes 2 and 3 to operate as standalone
87 Initially before `rc-node-1` we'll configure both nodes 2 and 3 to operate as standalone
88 nodes with their own hostnames. Use a default installation settings, and use
88 nodes with their own hostnames. Use a default installation settings, and use
89 the default local addresses (127.0.0.1) to configure VCSServer and Community/Enterprise instances.
89 the default local addresses (127.0.0.1) to configure VCSServer and Community/Enterprise instances.
90 All external connectivity will be handled by the reverse proxy (`Nginx`_ in our example).
90 All external connectivity will be handled by the reverse proxy (`Nginx`_ in our example).
91
91
92 This way we can ensure each individual host works,
92 This way we can ensure each individual host works,
93 accepts connections, or do some operations explicitly on chosen node.
93 accepts connections, or do some operations explicitly on chosen node.
94
94
95 In addition this would allow use to explicitly direct certain traffic to a node, e.g
95 In addition this would allow use to explicitly direct certain traffic to a node, e.g
96 CI server will only call directly `rc-node-3`. This should be done similar to normal
96 CI server will only call directly `rc-node-3`. This should be done similar to normal
97 installation so check out `Nginx`_/`Apache`_ configuration example to configure each host.
97 installation so check out `Nginx`_/`Apache`_ configuration example to configure each host.
98 Each one should already connect to shared database during installation.
98 Each one should already connect to shared database during installation.
99
99
100
100
101 1) Assuming our final url will be http://rc-node-1, Configure `instances_id`, `app.base_url`
101 1) Assuming our final url will be http://rc-node-1, Configure `instances_id`, `app.base_url`
102
102
103 a) On **rc-node-2** find the following settings and edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
103 a) On **rc-node-2** find the following settings and edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
104
104
105 .. code-block:: ini
105 .. code-block:: ini
106
106
107 ## required format is: *NAME-
107 ## required format is: *NAME-
108 instance_id = *rc-node-2-
108 instance_id = *rc-node-2-
109 app.base_url = http://rc-node-1
109 app.base_url = http://rc-node-1
110
110
111
111
112 b) On **rc-node-3** find the following settings and edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
112 b) On **rc-node-3** find the following settings and edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
113
113
114 .. code-block:: ini
114 .. code-block:: ini
115
115
116 ## required format is: *NAME-
116 ## required format is: *NAME-
117 instance_id = *rc-node-3-
117 instance_id = *rc-node-3-
118 app.base_url = http://rc-node-1
118 app.base_url = http://rc-node-1
119
119
120
120
121
121
122 2) Configure `User Session` to use a shared database. Example config that should be
122 2) Configure `User Session` to use a shared database. Example config that should be
123 changed on both **rc-node-2** and **rc-node-3** .
123 changed on both **rc-node-2** and **rc-node-3** .
124 Edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
124 Edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
125
125
126 .. code-block:: ini
126 .. code-block:: ini
127
127
128 ####################################
128 ####################################
129 ### BEAKER SESSION ####
129 ### BEAKER SESSION ####
130 ####################################
130 ####################################
131
131
132 ## Disable the default `file` sessions
132 ## Disable the default `file` sessions
133 #beaker.session.type = file
133 #beaker.session.type = file
134 #beaker.session.data_dir = %(here)s/data/sessions
134 #beaker.session.data_dir = %(here)s/data/sessions
135
135
136 ## use shared db based session, fast, and allows easy management over logged in users
136 ## use shared db based session, fast, and allows easy management over logged in users
137 beaker.session.type = ext:database
137 beaker.session.type = ext:database
138 beaker.session.table_name = db_session
138 beaker.session.table_name = db_session
139 # use our rc-node-1 here
139 # use our rc-node-1 here
140 beaker.session.sa.url = postgresql://postgres:qweqwe@rc-node-1/rhodecode
140 beaker.session.sa.url = postgresql://postgres:qweqwe@rc-node-1/rhodecode
141 beaker.session.sa.pool_recycle = 3600
141 beaker.session.sa.pool_recycle = 3600
142 beaker.session.sa.echo = false
142 beaker.session.sa.echo = false
143
143
144 In addition make sure both instances use the same `session.secret` so users have
144 In addition make sure both instances use the same `session.secret` so users have
145 persistent sessions across nodes. Please generate other one then in this example.
145 persistent sessions across nodes. Please generate other one then in this example.
146
146
147 .. code-block:: ini
147 .. code-block:: ini
148
148
149 # use a unique generated long string
149 # use a unique generated long string
150 beaker.session.secret = 70e116cae2274656ba7265fd860aebbd
150 beaker.session.secret = 70e116cae2274656ba7265fd860aebbd
151
151
152 3) Configure stored cached/archive cache to our shared NFS `rc-node-1`
152 3) Configure stored cached/archive cache to our shared NFS `rc-node-1`
153
153
154 .. code-block:: ini
154 .. code-block:: ini
155
155
156 # note the `_` prefix that allows using a directory without
156 # note the `_` prefix that allows using a directory without
157 # remap and rescan checking for vcs inside it.
157 # remap and rescan checking for vcs inside it.
158 cache_dir = /home/rcdev/storage/_cache_dir/data
158 cache_dir = /home/rcdev/storage/_cache_dir/data
159 # note archive cache dir is disabled by default, however if you enable
159 # note archive cache dir is disabled by default, however if you enable
160 # it also needs to be shared
160 # it also needs to be shared
161 #archive_cache_dir = /home/rcdev/storage/_tarball_cache_dir
161 #archive_cache_dir = /home/rcdev/storage/_tarball_cache_dir
162
162
163
163
164 4) Use shared exception store. Example config that should be
164 4) Use shared exception store. Example config that should be
165 changed on both **rc-node-2** and **rc-node-3**, and also for VCSServer.
165 changed on both **rc-node-2** and **rc-node-3**, and also for VCSServer.
166 Edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` and
166 Edit :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` and
167 :file:`/home/{user}/.rccontrol/{vcsserver-instance-id}/vcsserver.ini`
167 :file:`/home/{user}/.rccontrol/{vcsserver-instance-id}/vcsserver.ini`
168 and add/change following setting.
168 and add/change following setting.
169
169
170 .. code-block:: ini
170 .. code-block:: ini
171
171
172 exception_tracker.store_path = /home/rcdev/storage/_exception_store_data
172 exception_tracker.store_path = /home/rcdev/storage/_exception_store_data
173
173
174
174
175 5) Change cache backends to use `Redis`_ based caches. Below full example config
175 5) Change cache backends to use `Redis`_ based caches. Below full example config
176 that replaces default file-based cache to shared `Redis`_ with Distributed Lock.
176 that replaces default file-based cache to shared `Redis`_ with Distributed Lock.
177
177
178
178
179 .. code-block:: ini
179 .. code-block:: ini
180
180
181 #####################################
181 #####################################
182 ### DOGPILE CACHE ####
182 ### DOGPILE CACHE ####
183 #####################################
183 #####################################
184
184
185 ## `cache_perms` cache settings for permission tree, auth TTL.
185 ## `cache_perms` cache settings for permission tree, auth TTL.
186 #rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
186 #rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
187 #rc_cache.cache_perms.expiration_time = 300
187 #rc_cache.cache_perms.expiration_time = 300
188
188
189 ## alternative `cache_perms` redis backend with distributed lock
189 ## alternative `cache_perms` redis backend with distributed lock
190 rc_cache.cache_perms.backend = dogpile.cache.rc.redis
190 rc_cache.cache_perms.backend = dogpile.cache.rc.redis
191 rc_cache.cache_perms.expiration_time = 300
191 rc_cache.cache_perms.expiration_time = 300
192 ## redis_expiration_time needs to be greater then expiration_time
192 ## redis_expiration_time needs to be greater then expiration_time
193 rc_cache.cache_perms.arguments.redis_expiration_time = 7200
193 rc_cache.cache_perms.arguments.redis_expiration_time = 7200
194 rc_cache.cache_perms.arguments.socket_timeout = 30
194 rc_cache.cache_perms.arguments.socket_timeout = 30
195 rc_cache.cache_perms.arguments.host = rc-node-1
195 rc_cache.cache_perms.arguments.host = rc-node-1
196 rc_cache.cache_perms.arguments.password = qweqwe
196 rc_cache.cache_perms.arguments.password = qweqwe
197 rc_cache.cache_perms.arguments.port = 6379
197 rc_cache.cache_perms.arguments.port = 6379
198 rc_cache.cache_perms.arguments.db = 0
198 rc_cache.cache_perms.arguments.db = 0
199 rc_cache.cache_perms.arguments.distributed_lock = true
199 rc_cache.cache_perms.arguments.distributed_lock = true
200
200
201 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
201 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
202 #rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
202 #rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
203 #rc_cache.cache_repo.expiration_time = 2592000
203 #rc_cache.cache_repo.expiration_time = 2592000
204
204
205 ## alternative `cache_repo` redis backend with distributed lock
205 ## alternative `cache_repo` redis backend with distributed lock
206 rc_cache.cache_repo.backend = dogpile.cache.rc.redis
206 rc_cache.cache_repo.backend = dogpile.cache.rc.redis
207 rc_cache.cache_repo.expiration_time = 2592000
207 rc_cache.cache_repo.expiration_time = 2592000
208 ## redis_expiration_time needs to be greater then expiration_time
208 ## redis_expiration_time needs to be greater then expiration_time
209 rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
209 rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
210 rc_cache.cache_repo.arguments.socket_timeout = 30
210 rc_cache.cache_repo.arguments.socket_timeout = 30
211 rc_cache.cache_repo.arguments.host = rc-node-1
211 rc_cache.cache_repo.arguments.host = rc-node-1
212 rc_cache.cache_repo.arguments.password = qweqwe
212 rc_cache.cache_repo.arguments.password = qweqwe
213 rc_cache.cache_repo.arguments.port = 6379
213 rc_cache.cache_repo.arguments.port = 6379
214 rc_cache.cache_repo.arguments.db = 1
214 rc_cache.cache_repo.arguments.db = 1
215 rc_cache.cache_repo.arguments.distributed_lock = true
215 rc_cache.cache_repo.arguments.distributed_lock = true
216
216
217 ## cache settings for SQL queries, this needs to use memory type backend
217 ## cache settings for SQL queries, this needs to use memory type backend
218 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
218 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
219 rc_cache.sql_cache_short.expiration_time = 30
219 rc_cache.sql_cache_short.expiration_time = 30
220
220
221 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
221 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
222 ## type backend as the objects kept are not pickle serializable
222 ## type backend as the objects kept are not pickle serializable
223 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
223 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
224 ## by default we use 96H, this is using invalidation on push anyway
224 ## by default we use 96H, this is using invalidation on push anyway
225 rc_cache.cache_repo_longterm.expiration_time = 345600
225 rc_cache.cache_repo_longterm.expiration_time = 345600
226 ## max items in LRU cache, reduce this number to save memory, and expire last used
226 ## max items in LRU cache, reduce this number to save memory, and expire last used
227 ## cached objects
227 ## cached objects
228 rc_cache.cache_repo_longterm.max_size = 10000
228 rc_cache.cache_repo_longterm.max_size = 10000
229
229
230
230
231 6) Configure `Nginx`_ as reverse proxy on `rc-node-2/3`:
231 6) Configure `Nginx`_ as reverse proxy on `rc-node-2/3`:
232 Minimal `Nginx`_ config used:
232 Minimal `Nginx`_ config used:
233
233
234
234
235 .. code-block:: nginx
235 .. code-block:: nginx
236
236
237 ## rate limiter for certain pages to prevent brute force attacks
237 ## rate limiter for certain pages to prevent brute force attacks
238 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
238 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
239
239
240 ## custom log format
240 ## custom log format
241 log_format log_custom '$remote_addr - $remote_user [$time_local] '
241 log_format log_custom '$remote_addr - $remote_user [$time_local] '
242 '"$request" $status $body_bytes_sent '
242 '"$request" $status $body_bytes_sent '
243 '"$http_referer" "$http_user_agent" '
243 '"$http_referer" "$http_user_agent" '
244 '$request_time $upstream_response_time $pipe';
244 '$request_time $upstream_response_time $pipe';
245
245
246 server {
246 server {
247 listen 80;
247 listen 80;
248 server_name rc-node-2;
248 server_name rc-node-2;
249 #server_name rc-node-3;
249 #server_name rc-node-3;
250
250
251 access_log /var/log/nginx/rhodecode.access.log log_custom;
251 access_log /var/log/nginx/rhodecode.access.log log_custom;
252 error_log /var/log/nginx/rhodecode.error.log;
252 error_log /var/log/nginx/rhodecode.error.log;
253
253
254 # example of proxy.conf can be found in our docs.
254 # example of proxy.conf can be found in our docs.
255 include /etc/nginx/proxy.conf;
255 include /etc/nginx/proxy.conf;
256
256
257 ## serve static files by Nginx, recommended for performance
257 ## serve static files by Nginx, recommended for performance
258 location /_static/rhodecode {
258 location /_static/rhodecode {
259 gzip on;
259 gzip on;
260 gzip_min_length 500;
260 gzip_min_length 500;
261 gzip_proxied any;
261 gzip_proxied any;
262 gzip_comp_level 4;
262 gzip_comp_level 4;
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;
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 gzip_vary on;
264 gzip_vary on;
265 gzip_disable "msie6";
265 gzip_disable "msie6";
266 expires 60d;
266 #alias /home/rcdev/.rccontrol/community-1/static;
267 #alias /home/rcdev/.rccontrol/community-1/static;
267 alias /home/rcdev/.rccontrol/enterprise-1/static;
268 alias /home/rcdev/.rccontrol/enterprise-1/static;
268 }
269 }
269
270
270
271
271 location /_admin/login {
272 location /_admin/login {
272 limit_req zone=req_limit burst=10 nodelay;
273 limit_req zone=req_limit burst=10 nodelay;
273 try_files $uri @rhode;
274 try_files $uri @rhode;
274 }
275 }
275
276
276 location / {
277 location / {
277 try_files $uri @rhode;
278 try_files $uri @rhode;
278 }
279 }
279
280
280 location @rhode {
281 location @rhode {
281 # Url to running RhodeCode instance.
282 # Url to running RhodeCode instance.
282 # This is shown as `- URL: <host>` in output from rccontrol status.
283 # This is shown as `- URL: <host>` in output from rccontrol status.
283 proxy_pass http://127.0.0.1:10020;
284 proxy_pass http://127.0.0.1:10020;
284 }
285 }
285
286
286 ## custom 502 error page. Will be displayed while RhodeCode server
287 ## custom 502 error page. Will be displayed while RhodeCode server
287 ## is turned off
288 ## is turned off
288 error_page 502 /502.html;
289 error_page 502 /502.html;
289 location = /502.html {
290 location = /502.html {
290 #root /home/rcdev/.rccontrol/community-1/static;
291 #root /home/rcdev/.rccontrol/community-1/static;
291 root /home/rcdev/.rccontrol/enterprise-1/static;
292 root /home/rcdev/.rccontrol/enterprise-1/static;
292 }
293 }
293 }
294 }
294
295
295
296
296 7) Optional: Full text search, in case you use `Whoosh` full text search we also need a
297 7) Optional: Full text search, in case you use `Whoosh` full text search we also need a
297 shared storage for the index. In our example our NFS is mounted at `/home/rcdev/storage`
298 shared storage for the index. In our example our NFS is mounted at `/home/rcdev/storage`
298 which represents out storage so we can use the following:
299 which represents out storage so we can use the following:
299
300
300 .. code-block:: ini
301 .. code-block:: ini
301
302
302 # note the `_` prefix that allows using a directory without
303 # note the `_` prefix that allows using a directory without
303 # remap and rescan checking for vcs inside it.
304 # remap and rescan checking for vcs inside it.
304 search.location = /home/rcdev/storage/_index_data/index
305 search.location = /home/rcdev/storage/_index_data/index
305
306
306
307
307 .. note::
308 .. note::
308
309
309 If you use ElasticSearch it's by default shared, and simply running ES node is
310 If you use ElasticSearch it's by default shared, and simply running ES node is
310 by default cluster compatible.
311 by default cluster compatible.
311
312
312
313
313 8) Optional: If you intend to use mailing all instances need to use either a shared
314 8) Optional: If you intend to use mailing all instances need to use either a shared
314 mailing node, or each will use individual local mail agent. Simply put node-1/2/3
315 mailing node, or each will use individual local mail agent. Simply put node-1/2/3
315 needs to use same mailing configuration.
316 needs to use same mailing configuration.
316
317
317
318
318
319
319 Setup rc-node-1
320 Setup rc-node-1
320 ^^^^^^^^^^^^^^^
321 ^^^^^^^^^^^^^^^
321
322
322
323
323 Configure `Nginx`_ as Load Balancer to rc-node-2/3.
324 Configure `Nginx`_ as Load Balancer to rc-node-2/3.
324 Minimal `Nginx`_ example below:
325 Minimal `Nginx`_ example below:
325
326
326 .. code-block:: nginx
327 .. code-block:: nginx
327
328
328 ## define rc-cluster which contains a pool of our instances to connect to
329 ## define rc-cluster which contains a pool of our instances to connect to
329 upstream rc-cluster {
330 upstream rc-cluster {
330 # rc-node-2/3 are stored in /etc/hosts with correct IP addresses
331 # rc-node-2/3 are stored in /etc/hosts with correct IP addresses
331 server rc-node-2:80;
332 server rc-node-2:80;
332 server rc-node-3:80;
333 server rc-node-3:80;
333 }
334 }
334
335
335 server {
336 server {
336 listen 80;
337 listen 80;
337 server_name rc-node-1;
338 server_name rc-node-1;
338
339
339 location / {
340 location / {
340 proxy_pass http://rc-cluster;
341 proxy_pass http://rc-cluster;
341 }
342 }
342 }
343 }
343
344
344
345
345 .. note::
346 .. note::
346
347
347 You should configure your load balancing accordingly. We recommend writing
348 You should configure your load balancing accordingly. We recommend writing
348 load balancing rules that will separate regular user traffic from
349 load balancing rules that will separate regular user traffic from
349 automated process traffic like continuous servers or build bots. Sticky sessions
350 automated process traffic like continuous servers or build bots. Sticky sessions
350 are not required.
351 are not required.
351
352
352
353
353 Show which instance handles a request
354 Show which instance handles a request
354 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
355 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
355
356
356 You can easily check if load-balancing is working as expected. Visit our main node
357 You can easily check if load-balancing is working as expected. Visit our main node
357 `rc-node-1` URL which at that point should already handle incoming requests and balance
358 `rc-node-1` URL which at that point should already handle incoming requests and balance
358 it across node-2/3.
359 it across node-2/3.
359
360
360 Add a special GET param `?showrcid=1` to show current instance handling your request.
361 Add a special GET param `?showrcid=1` to show current instance handling your request.
361
362
362 For example: visiting url `http://rc-node-1/?showrcid=1` will show, in the bottom
363 For example: visiting url `http://rc-node-1/?showrcid=1` will show, in the bottom
363 of the screen` cluster instance info.
364 of the screen` cluster instance info.
364 e.g: `RhodeCode instance id: rc-node-3-rc-node-3-3246`
365 e.g: `RhodeCode instance id: rc-node-3-rc-node-3-3246`
365 which is generated from::
366 which is generated from::
366
367
367 <NODE_HOSTNAME>-<INSTANCE_ID>-<WORKER_PID>
368 <NODE_HOSTNAME>-<INSTANCE_ID>-<WORKER_PID>
368
369
369
370
370 Using Celery with cluster
371 Using Celery with cluster
371 ^^^^^^^^^^^^^^^^^^^^^^^^^
372 ^^^^^^^^^^^^^^^^^^^^^^^^^
372
373
373
374
374 If `Celery` is used we recommend setting also an instance of Enterprise/Community+VCSserver
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 on the node that is running `RabbitMQ`_ or `Redis`_. Those instances will be used to
376 tasks on the `rc-node-1`. This is the most efficient setup. `Celery` usually
377 executed async tasks on the `rc-node-1`. This is the most efficient setup.
377 handles tasks such as sending emails, forking repositories, importing
378 `Celery` usually handles tasks such as sending emails, forking repositories, importing
378 repositories from external location etc. Using workers on instance that has
379 repositories from external location etc. Using workers on instance that has
379 the direct access to disks used by NFS as well as email server gives noticeable
380 the direct access to disks used by NFS as well as email server gives noticeable
380 performance boost. Running local workers to the NFS storage results in faster
381 performance boost. Running local workers to the NFS storage results in faster
381 execution of forking large repositories or sending lots of emails.
382 execution of forking large repositories or sending lots of emails.
382
383
383 Those instances need to be configured in the same way as for other nodes.
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 For best results let it be isolated to only executing `Celery` tasks in the cluster setup.
386 For best results let it be isolated to only executing `Celery` tasks in the cluster setup.
386
387
387
388
388 .. _Gunicorn: http://gunicorn.org/
389 .. _Gunicorn: http://gunicorn.org/
389 .. _Whoosh: https://pypi.python.org/pypi/Whoosh/
390 .. _Whoosh: https://pypi.python.org/pypi/Whoosh/
390 .. _Elasticsearch: https://www.elastic.co/..
391 .. _Elasticsearch: https://www.elastic.co/..
391 .. _RabbitMQ: http://www.rabbitmq.com/
392 .. _RabbitMQ: http://www.rabbitmq.com/
392 .. _Nginx: http://nginx.io
393 .. _Nginx: http://nginx.io
393 .. _Apache: http://nginx.io
394 .. _Apache: http://nginx.io
394 .. _Redis: http://redis.io
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
6 Starting from Version 4.18.X RhodeCode has a builtin memory monitor for gunicorn workers.
7 available to your |RCE| instance. If you find that memory resources are under
7 Enabling this can limit the maximum amount of memory system can use. Each worker
8 pressure, see the :ref:`vcs-server-maintain` section for details.
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 .. _vcs-server:
1 .. _vcs-server:
2
2
3 VCS Server Management
3 VCS Server Management
4 ---------------------
4 ---------------------
5
5
6 The VCS Server handles |RCE| backend functionality. You need to configure
6 The VCS Server handles |RCE| backend functionality. You need to configure
7 a VCS Server to run with a |RCE| instance. If you do not, you will be missing
7 a VCS Server to run with a |RCE| instance. If you do not, you will be missing
8 the connection between |RCE| and its |repos|. This will cause error messages
8 the connection between |RCE| and its |repos|. This will cause error messages
9 on the web interface. You can run your setup in the following configurations,
9 on the web interface. You can run your setup in the following configurations,
10 currently the best performance is one of following:
10 currently the best performance is one of following:
11
11
12 * One VCS Server per |RCE| instance.
12 * One VCS Server per |RCE| instance.
13 * One VCS Server handling multiple instances.
13 * One VCS Server handling multiple instances.
14
14
15 .. important::
15 .. important::
16
16
17 If your server locale settings are not correctly configured,
17 If your server locale settings are not correctly configured,
18 |RCE| and the VCS Server can run into issues. See this `Ask Ubuntu`_ post
18 |RCE| and the VCS Server can run into issues. See this `Ask Ubuntu`_ post
19 which explains the problem and gives a solution.
19 which explains the problem and gives a solution.
20
20
21 For more information, see the following sections:
21 For more information, see the following sections:
22
22
23 * :ref:`install-vcs`
23 * :ref:`install-vcs`
24 * :ref:`config-vcs`
24 * :ref:`config-vcs`
25 * :ref:`vcs-server-options`
25 * :ref:`vcs-server-options`
26 * :ref:`vcs-server-versions`
26 * :ref:`vcs-server-versions`
27 * :ref:`vcs-server-maintain`
27 * :ref:`vcs-server-maintain`
28 * :ref:`vcs-server-config-file`
28 * :ref:`vcs-server-config-file`
29 * :ref:`svn-http`
29 * :ref:`svn-http`
30
30
31 .. _install-vcs:
31 .. _install-vcs:
32
32
33 VCS Server Installation
33 VCS Server Installation
34 ^^^^^^^^^^^^^^^^^^^^^^^
34 ^^^^^^^^^^^^^^^^^^^^^^^
35
35
36 To install a VCS Server, see
36 To install a VCS Server, see
37 :ref:`Installing a VCS server <control:install-vcsserver>`.
37 :ref:`Installing a VCS server <control:install-vcsserver>`.
38
38
39 .. _config-vcs:
39 .. _config-vcs:
40
40
41 Hooking |RCE| to its VCS Server
41 Hooking |RCE| to its VCS Server
42 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
42 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
43
43
44 To configure a |RCE| instance to use a VCS server, see
44 To configure a |RCE| instance to use a VCS server, see
45 :ref:`Configuring the VCS Server connection <control:manually-vcsserver-ini>`.
45 :ref:`Configuring the VCS Server connection <control:manually-vcsserver-ini>`.
46
46
47 .. _vcs-server-options:
47 .. _vcs-server-options:
48
48
49 |RCE| VCS Server Options
49 |RCE| VCS Server Options
50 ^^^^^^^^^^^^^^^^^^^^^^^^
50 ^^^^^^^^^^^^^^^^^^^^^^^^
51
51
52 The following list shows the available options on the |RCE| side of the
52 The following list shows the available options on the |RCE| side of the
53 connection to the VCS Server. The settings are configured per
53 connection to the VCS Server. The settings are configured per
54 instance in the
54 instance in the
55 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
55 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
56
56
57 .. rst-class:: dl-horizontal
57 .. rst-class:: dl-horizontal
58
58
59 \vcs.backends <available-vcs-systems>
59 \vcs.backends <available-vcs-systems>
60 Set a comma-separated list of the |repo| options available from the
60 Set a comma-separated list of the |repo| options available from the
61 web interface. The default is ``hg, git, svn``,
61 web interface. The default is ``hg, git, svn``,
62 which is all |repo| types available. The order of backends is also the
62 which is all |repo| types available. The order of backends is also the
63 order backend will try to detect requests type.
63 order backend will try to detect requests type.
64
64
65 \vcs.connection_timeout <seconds>
65 \vcs.connection_timeout <seconds>
66 Set the length of time in seconds that the VCS Server waits for
66 Set the length of time in seconds that the VCS Server waits for
67 requests to process. After the timeout expires,
67 requests to process. After the timeout expires,
68 the request is closed. The default is ``3600``. Set to a higher
68 the request is closed. The default is ``3600``. Set to a higher
69 number if you experience network latency, or timeout issues with very
69 number if you experience network latency, or timeout issues with very
70 large push/pull requests.
70 large push/pull requests.
71
71
72 \vcs.server.enable <boolean>
72 \vcs.server.enable <boolean>
73 Enable or disable the VCS Server. The available options are ``true`` or
73 Enable or disable the VCS Server. The available options are ``true`` or
74 ``false``. The default is ``true``.
74 ``false``. The default is ``true``.
75
75
76 \vcs.server <host:port>
76 \vcs.server <host:port>
77 Set the host, either hostname or IP Address, and port of the VCS server
77 Set the host, either hostname or IP Address, and port of the VCS server
78 you wish to run with your |RCE| instance.
78 you wish to run with your |RCE| instance.
79
79
80 .. code-block:: ini
80 .. code-block:: ini
81
81
82 ##################
82 ##################
83 ### VCS CONFIG ###
83 ### VCS CONFIG ###
84 ##################
84 ##################
85 # set this line to match your VCS Server
85 # set this line to match your VCS Server
86 vcs.server = 127.0.0.1:10004
86 vcs.server = 127.0.0.1:10004
87 # Set to False to disable the VCS Server
87 # Set to False to disable the VCS Server
88 vcs.server.enable = True
88 vcs.server.enable = True
89 vcs.backends = hg, git, svn
89 vcs.backends = hg, git, svn
90 vcs.connection_timeout = 3600
90 vcs.connection_timeout = 3600
91
91
92
92
93 .. _vcs-server-versions:
93 .. _vcs-server-versions:
94
94
95 VCS Server Versions
95 VCS Server Versions
96 ^^^^^^^^^^^^^^^^^^^
96 ^^^^^^^^^^^^^^^^^^^
97
97
98 An updated version of the VCS Server is released with each |RCE| version. Use
98 An updated version of the VCS Server is released with each |RCE| version. Use
99 the VCS Server number that matches with the |RCE| version to pair the
99 the VCS Server number that matches with the |RCE| version to pair the
100 appropriate ones together. For |RCE| versions pre 3.3.0,
100 appropriate ones together. For |RCE| versions pre 3.3.0,
101 VCS Server 1.X.Y works with |RCE| 3.X.Y, for example:
101 VCS Server 1.X.Y works with |RCE| 3.X.Y, for example:
102
102
103 * VCS Server 1.0.0 works with |RCE| 3.0.0
103 * VCS Server 1.0.0 works with |RCE| 3.0.0
104 * VCS Server 1.2.2 works with |RCE| 3.2.2
104 * VCS Server 1.2.2 works with |RCE| 3.2.2
105
105
106 For |RCE| versions post 3.3.0, the VCS Server and |RCE| version numbers
106 For |RCE| versions post 3.3.0, the VCS Server and |RCE| version numbers
107 match, for example:
107 match, for example:
108
108
109 * VCS Server |release| works with |RCE| |release|
109 * VCS Server |release| works with |RCE| |release|
110
110
111 .. _vcs-server-maintain:
111 .. _vcs-server-maintain:
112
112
113 VCS Server Memory Optimization
113 VCS Server Cache Optimization
114 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
114 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
115
115
116 To optimize the VCS server to manage the cache and memory usage efficiently, you need to
116 To optimize the VCS server to manage the cache and memory usage efficiently, it's recommended to
117 configure the following options in the
117 configure the Redis backend for VCSServer caches.
118 :file:`/home/{user}/.rccontrol/{vcsserver-id}/vcsserver.ini` file. Once
118 Once configured, restart the VCS Server.
119 configured, restart the VCS Server. By default we use an optimal settings, but in certain
119
120 conditions tunning expiration_time and max_size can affect memory usage and performance
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 .. code-block:: ini
124 .. code-block:: ini
123
125
124 ## cache region for storing repo_objects cache
126 ; ensure the default file based cache is *commented out*
125 rc_cache.repo_object.backend = dogpile.cache.rc.memory_lru
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
130 ; `repo_object` cache settings for vcs methods for repositories
128 rc_cache.repo_object.expiration_time = 300
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
133 ; cache auto-expires after N seconds
131 ## Sets the maximum number of items stored in the cache, before the cache
134 ; Examples: 86400 (1Day), 604800 (7Days), 1209600 (14Days), 2592000 (30days), 7776000 (90Days)
132 ## starts to be cleared.
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
140 rc_cache.repo_object.arguments.host = localhost
135 ## 5GB cache. Running it at 240 resulted in a 9GB cache. Your results
141 rc_cache.repo_object.arguments.port = 6379
136 ## will differ based on usage patterns and |repo| sizes.
142 rc_cache.repo_object.arguments.db = 5
137
143 rc_cache.repo_object.arguments.socket_timeout = 30
138 ## Tweaking this value to run at a fairly constant memory load on your
144 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
139 ## server will help performance.
145 rc_cache.repo_object.arguments.distributed_lock = true
140
141 rc_cache.repo_object.max_size = 120
142
146
143
147
144 To clear the cache completely, you can restart the VCS Server.
148 To clear the cache completely, you can restart the VCS Server.
145
149
146 .. important::
150 .. important::
147
151
148 While the VCS Server handles a restart gracefully on the web interface,
152 While the VCS Server handles a restart gracefully on the web interface,
149 it will drop connections during push/pull requests. So it is recommended
153 it will drop connections during push/pull requests. So it is recommended
150 you only perform this when there is very little traffic on the instance.
154 you only perform this when there is very little traffic on the instance.
151
155
152 Use the following example to restart your VCS Server,
156 Use the following example to restart your VCS Server,
153 for full details see the :ref:`RhodeCode Control CLI <control:rcc-cli>`.
157 for full details see the :ref:`RhodeCode Control CLI <control:rcc-cli>`.
154
158
155 .. code-block:: bash
159 .. code-block:: bash
156
160
157 $ rccontrol status
161 $ rccontrol status
158
162
159 .. code-block:: vim
163 .. code-block:: vim
160
164
161 - NAME: vcsserver-1
165 - NAME: vcsserver-1
162 - STATUS: RUNNING
166 - STATUS: RUNNING
163 logs:/home/ubuntu/.rccontrol/vcsserver-1/vcsserver.log
167 logs:/home/ubuntu/.rccontrol/vcsserver-1/vcsserver.log
164 - VERSION: 4.7.2 VCSServer
168 - VERSION: 4.7.2 VCSServer
165 - URL: http://127.0.0.1:10008
169 - URL: http://127.0.0.1:10008
166 - CONFIG: /home/ubuntu/.rccontrol/vcsserver-1/vcsserver.ini
170 - CONFIG: /home/ubuntu/.rccontrol/vcsserver-1/vcsserver.ini
167
171
168 $ rccontrol restart vcsserver-1
172 $ rccontrol restart vcsserver-1
169 Instance "vcsserver-1" successfully stopped.
173 Instance "vcsserver-1" successfully stopped.
170 Instance "vcsserver-1" successfully started.
174 Instance "vcsserver-1" successfully started.
171
175
172 .. _vcs-server-config-file:
176 .. _vcs-server-config-file:
173
177
174 VCS Server Configuration
178 VCS Server Configuration
175 ^^^^^^^^^^^^^^^^^^^^^^^^
179 ^^^^^^^^^^^^^^^^^^^^^^^^
176
180
177 You can configure settings for multiple VCS Servers on your
181 You can configure settings for multiple VCS Servers on your
178 system using their individual configuration files. Use the following
182 system using their individual configuration files. Use the following
179 properties inside the configuration file to set up your system. The default
183 properties inside the configuration file to set up your system. The default
180 location is :file:`home/{user}/.rccontrol/{vcsserver-id}/vcsserver.ini`.
184 location is :file:`home/{user}/.rccontrol/{vcsserver-id}/vcsserver.ini`.
181 For a more detailed explanation of the logger levers, see :ref:`debug-mode`.
185 For a more detailed explanation of the logger levers, see :ref:`debug-mode`.
182
186
183 .. rst-class:: dl-horizontal
187 .. rst-class:: dl-horizontal
184
188
185 \host <ip-address>
189 \host <ip-address>
186 Set the host on which the VCS Server will run. VCSServer is not
190 Set the host on which the VCS Server will run. VCSServer is not
187 protected by any authentication, so we *highly* recommend running it
191 protected by any authentication, so we *highly* recommend running it
188 under localhost ip that is `127.0.0.1`
192 under localhost ip that is `127.0.0.1`
189
193
190 \port <int>
194 \port <int>
191 Set the port number on which the VCS Server will be available.
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 .. note::
198 .. note::
214
199
215 After making changes, you need to restart your VCS Server to pick them up.
200 After making changes, you need to restart your VCS Server to pick them up.
216
201
217 .. code-block:: ini
202 .. code-block:: ini
218
203
219 ################################################################################
204 ; #################################
220 # RhodeCode VCSServer with HTTP Backend - configuration #
205 ; RHODECODE VCSSERVER CONFIGURATION
221 # #
206 ; #################################
222 ################################################################################
223
224
207
225 [server:main]
208 [server:main]
226 ## COMMON ##
209 ; COMMON HOST/IP CONFIG
227 host = 127.0.0.1
210 host = 127.0.0.1
228 port = 10002
211 port = 10002
229
212
230 ##########################
213 ; ###########################
231 ## GUNICORN WSGI SERVER ##
214 ; GUNICORN APPLICATION SERVER
232 ##########################
215 ; ###########################
233 ## run with gunicorn --log-config vcsserver.ini --paste vcsserver.ini
216
217 ; run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
218
219 ; Module to use, this setting shouldn't be changed
234 use = egg:gunicorn#main
220 use = egg:gunicorn#main
235 ## Sets the number of process workers. Recommended
221
236 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
222 ; Sets the number of process workers. More workers means more concurrent connections
237 workers = 3
223 ; RhodeCode can handle at the same time. Each additional worker also it increases
238 ## process name
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 proc_name = rhodecode_vcsserver
235 proc_name = rhodecode_vcsserver
240 ## type of worker class, one of sync, gevent
236
241 ## recommended for bigger setup is using of of other than sync one
237 ; Type of worker class, one of sync, gevent
238 ; currently `sync` is the only option allowed.
242 worker_class = sync
239 worker_class = sync
243 ## The maximum number of simultaneous clients. Valid only for Gevent
240
244 #worker_connections = 10
241 ; The maximum number of simultaneous clients. Valid only for gevent
245 ## max number of requests that worker will handle before being gracefully
242 worker_connections = 10
246 ## restarted, could prevent memory leaks
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 max_requests = 1000
246 max_requests = 1000
248 max_requests_jitter = 30
247 max_requests_jitter = 30
249 ## amount of time a worker can spend with handling a request before it
248
250 ## gets killed and restarted. Set to 6hrs
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 timeout = 21600
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 [app:main]
293 [app:main]
254 use = egg:rhodecode-vcsserver
294 use = egg:rhodecode-vcsserver
255
295
256 pyramid.default_locale_name = en
296 pyramid.default_locale_name = en
257 pyramid.includes =
297 pyramid.includes =
258
298
259 ## default locale used by VCS systems
299 ; default locale used by VCS systems
260 locale = en_US.UTF-8
300 locale = en_US.UTF-8
261
301
262 # cache regions, please don't change
302 ; #############
263 beaker.cache.regions = repo_object
303 ; DOGPILE CACHE
264 beaker.cache.repo_object.type = memorylru
304 ; #############
265 beaker.cache.repo_object.max_items = 100
305
266 # cache auto-expires after N seconds
306 ; Default cache dir for caches. Putting this into a ramdisk can boost performance.
267 beaker.cache.repo_object.expire = 300
307 ; eg. /tmpfs/data_ramdisk, however this directory might require large amount of space
268 beaker.cache.repo_object.enabled = true
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 ################################
322 ; redis_expiration_time needs to be greater then expiration_time
272 ### LOGGING CONFIGURATION ####
323 rc_cache.repo_object.arguments.redis_expiration_time = 3592000
273 ################################
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 [loggers]
335 [loggers]
275 keys = root, vcsserver, beaker
336 keys = root, vcsserver
276
337
277 [handlers]
338 [handlers]
278 keys = console
339 keys = console
279
340
280 [formatters]
341 [formatters]
281 keys = generic
342 keys = generic
282
343
283 #############
344 ; #######
284 ## LOGGERS ##
345 ; LOGGERS
285 #############
346 ; #######
286 [logger_root]
347 [logger_root]
287 level = NOTSET
348 level = NOTSET
288 handlers = console
349 handlers = console
289
350
290 [logger_vcsserver]
351 [logger_vcsserver]
291 level = DEBUG
352 level = DEBUG
292 handlers =
353 handlers =
293 qualname = vcsserver
354 qualname = vcsserver
294 propagate = 1
355 propagate = 1
295
356
296 [logger_beaker]
297 level = DEBUG
298 handlers =
299 qualname = beaker
300 propagate = 1
301
357
302
358 ; ########
303 ##############
359 ; HANDLERS
304 ## HANDLERS ##
360 ; ########
305 ##############
306
361
307 [handler_console]
362 [handler_console]
308 class = StreamHandler
363 class = StreamHandler
309 args = (sys.stderr,)
364 args = (sys.stderr, )
310 level = DEBUG
365 level = INFO
311 formatter = generic
366 formatter = generic
312
367
313 ################
368 ; ##########
314 ## FORMATTERS ##
369 ; FORMATTERS
315 ################
370 ; ##########
316
371
317 [formatter_generic]
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 datefmt = %Y-%m-%d %H:%M:%S
374 datefmt = %Y-%m-%d %H:%M:%S
320
375
321
376
322 .. _Subversion Red Book: http://svnbook.red-bean.com/en/1.7/svn-book.html#svn.ref.svn
377 .. _Subversion Red Book: http://svnbook.red-bean.com/en/1.7/svn-book.html#svn.ref.svn
323
378
324 .. _Ask Ubuntu: http://askubuntu.com/questions/162391/how-do-i-fix-my-locale-issue
379 .. _Ask Ubuntu: http://askubuntu.com/questions/162391/how-do-i-fix-my-locale-issue
@@ -1,434 +1,442 b''
1 .. _pull-request-methods-ref:
1 .. _pull-request-methods-ref:
2
2
3 pull_request methods
3 pull_request methods
4 ====================
4 ====================
5
5
6 close_pull_request
6 close_pull_request
7 ------------------
7 ------------------
8
8
9 .. py:function:: close_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>, message=<Optional:''>)
9 .. py:function:: close_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>, message=<Optional:''>)
10
10
11 Close the pull request specified by `pullrequestid`.
11 Close the pull request specified by `pullrequestid`.
12
12
13 :param apiuser: This is filled automatically from the |authtoken|.
13 :param apiuser: This is filled automatically from the |authtoken|.
14 :type apiuser: AuthUser
14 :type apiuser: AuthUser
15 :param repoid: Repository name or repository ID to which the pull
15 :param repoid: Repository name or repository ID to which the pull
16 request belongs.
16 request belongs.
17 :type repoid: str or int
17 :type repoid: str or int
18 :param pullrequestid: ID of the pull request to be closed.
18 :param pullrequestid: ID of the pull request to be closed.
19 :type pullrequestid: int
19 :type pullrequestid: int
20 :param userid: Close the pull request as this user.
20 :param userid: Close the pull request as this user.
21 :type userid: Optional(str or int)
21 :type userid: Optional(str or int)
22 :param message: Optional message to close the Pull Request with. If not
22 :param message: Optional message to close the Pull Request with. If not
23 specified it will be generated automatically.
23 specified it will be generated automatically.
24 :type message: Optional(str)
24 :type message: Optional(str)
25
25
26 Example output:
26 Example output:
27
27
28 .. code-block:: bash
28 .. code-block:: bash
29
29
30 "id": <id_given_in_input>,
30 "id": <id_given_in_input>,
31 "result": {
31 "result": {
32 "pull_request_id": "<int>",
32 "pull_request_id": "<int>",
33 "close_status": "<str:status_lbl>,
33 "close_status": "<str:status_lbl>,
34 "closed": "<bool>"
34 "closed": "<bool>"
35 },
35 },
36 "error": null
36 "error": null
37
37
38
38
39 comment_pull_request
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 Comment on the pull request specified with the `pullrequestid`,
44 Comment on the pull request specified with the `pullrequestid`,
45 in the |repo| specified by the `repoid`, and optionally change the
45 in the |repo| specified by the `repoid`, and optionally change the
46 review status.
46 review status.
47
47
48 :param apiuser: This is filled automatically from the |authtoken|.
48 :param apiuser: This is filled automatically from the |authtoken|.
49 :type apiuser: AuthUser
49 :type apiuser: AuthUser
50 :param repoid: Optional repository name or repository ID.
50 :param repoid: Optional repository name or repository ID.
51 :type repoid: str or int
51 :type repoid: str or int
52 :param pullrequestid: The pull request ID.
52 :param pullrequestid: The pull request ID.
53 :type pullrequestid: int
53 :type pullrequestid: int
54 :param commit_id: Specify the commit_id for which to set a comment. If
54 :param commit_id: Specify the commit_id for which to set a comment. If
55 given commit_id is different than latest in the PR status
55 given commit_id is different than latest in the PR status
56 change won't be performed.
56 change won't be performed.
57 :type commit_id: str
57 :type commit_id: str
58 :param message: The text content of the comment.
58 :param message: The text content of the comment.
59 :type message: str
59 :type message: str
60 :param status: (**Optional**) Set the approval status of the pull
60 :param status: (**Optional**) Set the approval status of the pull
61 request. One of: 'not_reviewed', 'approved', 'rejected',
61 request. One of: 'not_reviewed', 'approved', 'rejected',
62 'under_review'
62 'under_review'
63 :type status: str
63 :type status: str
64 :param comment_type: Comment type, one of: 'note', 'todo'
64 :param comment_type: Comment type, one of: 'note', 'todo'
65 :type comment_type: Optional(str), default: 'note'
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 :param userid: Comment on the pull request as this user
71 :param userid: Comment on the pull request as this user
67 :type userid: Optional(str or int)
72 :type userid: Optional(str or int)
68
73
69 Example output:
74 Example output:
70
75
71 .. code-block:: bash
76 .. code-block:: bash
72
77
73 id : <id_given_in_input>
78 id : <id_given_in_input>
74 result : {
79 result : {
75 "pull_request_id": "<Integer>",
80 "pull_request_id": "<Integer>",
76 "comment_id": "<Integer>",
81 "comment_id": "<Integer>",
77 "status": {"given": <given_status>,
82 "status": {"given": <given_status>,
78 "was_changed": <bool status_was_actually_changed> },
83 "was_changed": <bool status_was_actually_changed> },
79 },
84 },
80 error : null
85 error : null
81
86
82
87
83 create_pull_request
88 create_pull_request
84 -------------------
89 -------------------
85
90
86 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, owner=<Optional:<OptionalAttr:apiuser>>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>)
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 Creates a new pull request.
93 Creates a new pull request.
89
94
90 Accepts refs in the following formats:
95 Accepts refs in the following formats:
91
96
92 * branch:<branch_name>:<sha>
97 * branch:<branch_name>:<sha>
93 * branch:<branch_name>
98 * branch:<branch_name>
94 * bookmark:<bookmark_name>:<sha> (Mercurial only)
99 * bookmark:<bookmark_name>:<sha> (Mercurial only)
95 * bookmark:<bookmark_name> (Mercurial only)
100 * bookmark:<bookmark_name> (Mercurial only)
96
101
97 :param apiuser: This is filled automatically from the |authtoken|.
102 :param apiuser: This is filled automatically from the |authtoken|.
98 :type apiuser: AuthUser
103 :type apiuser: AuthUser
99 :param source_repo: Set the source repository name.
104 :param source_repo: Set the source repository name.
100 :type source_repo: str
105 :type source_repo: str
101 :param target_repo: Set the target repository name.
106 :param target_repo: Set the target repository name.
102 :type target_repo: str
107 :type target_repo: str
103 :param source_ref: Set the source ref name.
108 :param source_ref: Set the source ref name.
104 :type source_ref: str
109 :type source_ref: str
105 :param target_ref: Set the target ref name.
110 :param target_ref: Set the target ref name.
106 :type target_ref: str
111 :type target_ref: str
107 :param owner: user_id or username
112 :param owner: user_id or username
108 :type owner: Optional(str)
113 :type owner: Optional(str)
109 :param title: Optionally Set the pull request title, it's generated otherwise
114 :param title: Optionally Set the pull request title, it's generated otherwise
110 :type title: str
115 :type title: str
111 :param description: Set the pull request description.
116 :param description: Set the pull request description.
112 :type description: Optional(str)
117 :type description: Optional(str)
113 :type description_renderer: Optional(str)
118 :type description_renderer: Optional(str)
114 :param description_renderer: Set pull request renderer for the description.
119 :param description_renderer: Set pull request renderer for the description.
115 It should be 'rst', 'markdown' or 'plain'. If not give default
120 It should be 'rst', 'markdown' or 'plain'. If not give default
116 system renderer will be used
121 system renderer will be used
117 :param reviewers: Set the new pull request reviewers list.
122 :param reviewers: Set the new pull request reviewers list.
118 Reviewer defined by review rules will be added automatically to the
123 Reviewer defined by review rules will be added automatically to the
119 defined list.
124 defined list.
120 :type reviewers: Optional(list)
125 :type reviewers: Optional(list)
121 Accepts username strings or objects of the format:
126 Accepts username strings or objects of the format:
122
127
123 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
128 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
124
129
125
130
126 get_pull_request
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 Get a pull request based on the given ID.
136 Get a pull request based on the given ID.
132
137
133 :param apiuser: This is filled automatically from the |authtoken|.
138 :param apiuser: This is filled automatically from the |authtoken|.
134 :type apiuser: AuthUser
139 :type apiuser: AuthUser
135 :param repoid: Optional, repository name or repository ID from where
140 :param repoid: Optional, repository name or repository ID from where
136 the pull request was opened.
141 the pull request was opened.
137 :type repoid: str or int
142 :type repoid: str or int
138 :param pullrequestid: ID of the requested pull request.
143 :param pullrequestid: ID of the requested pull request.
139 :type pullrequestid: int
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 Example output:
149 Example output:
142
150
143 .. code-block:: bash
151 .. code-block:: bash
144
152
145 "id": <id_given_in_input>,
153 "id": <id_given_in_input>,
146 "result":
154 "result":
147 {
155 {
148 "pull_request_id": "<pull_request_id>",
156 "pull_request_id": "<pull_request_id>",
149 "url": "<url>",
157 "url": "<url>",
150 "title": "<title>",
158 "title": "<title>",
151 "description": "<description>",
159 "description": "<description>",
152 "status" : "<status>",
160 "status" : "<status>",
153 "created_on": "<date_time_created>",
161 "created_on": "<date_time_created>",
154 "updated_on": "<date_time_updated>",
162 "updated_on": "<date_time_updated>",
155 "commit_ids": [
163 "commit_ids": [
156 ...
164 ...
157 "<commit_id>",
165 "<commit_id>",
158 "<commit_id>",
166 "<commit_id>",
159 ...
167 ...
160 ],
168 ],
161 "review_status": "<review_status>",
169 "review_status": "<review_status>",
162 "mergeable": {
170 "mergeable": {
163 "status": "<bool>",
171 "status": "<bool>",
164 "message": "<message>",
172 "message": "<message>",
165 },
173 },
166 "source": {
174 "source": {
167 "clone_url": "<clone_url>",
175 "clone_url": "<clone_url>",
168 "repository": "<repository_name>",
176 "repository": "<repository_name>",
169 "reference":
177 "reference":
170 {
178 {
171 "name": "<name>",
179 "name": "<name>",
172 "type": "<type>",
180 "type": "<type>",
173 "commit_id": "<commit_id>",
181 "commit_id": "<commit_id>",
174 }
182 }
175 },
183 },
176 "target": {
184 "target": {
177 "clone_url": "<clone_url>",
185 "clone_url": "<clone_url>",
178 "repository": "<repository_name>",
186 "repository": "<repository_name>",
179 "reference":
187 "reference":
180 {
188 {
181 "name": "<name>",
189 "name": "<name>",
182 "type": "<type>",
190 "type": "<type>",
183 "commit_id": "<commit_id>",
191 "commit_id": "<commit_id>",
184 }
192 }
185 },
193 },
186 "merge": {
194 "merge": {
187 "clone_url": "<clone_url>",
195 "clone_url": "<clone_url>",
188 "reference":
196 "reference":
189 {
197 {
190 "name": "<name>",
198 "name": "<name>",
191 "type": "<type>",
199 "type": "<type>",
192 "commit_id": "<commit_id>",
200 "commit_id": "<commit_id>",
193 }
201 }
194 },
202 },
195 "author": <user_obj>,
203 "author": <user_obj>,
196 "reviewers": [
204 "reviewers": [
197 ...
205 ...
198 {
206 {
199 "user": "<user_obj>",
207 "user": "<user_obj>",
200 "review_status": "<review_status>",
208 "review_status": "<review_status>",
201 }
209 }
202 ...
210 ...
203 ]
211 ]
204 },
212 },
205 "error": null
213 "error": null
206
214
207
215
208 get_pull_request_comments
216 get_pull_request_comments
209 -------------------------
217 -------------------------
210
218
211 .. py:function:: get_pull_request_comments(apiuser, pullrequestid, repoid=<Optional:None>)
219 .. py:function:: get_pull_request_comments(apiuser, pullrequestid, repoid=<Optional:None>)
212
220
213 Get all comments of pull request specified with the `pullrequestid`
221 Get all comments of pull request specified with the `pullrequestid`
214
222
215 :param apiuser: This is filled automatically from the |authtoken|.
223 :param apiuser: This is filled automatically from the |authtoken|.
216 :type apiuser: AuthUser
224 :type apiuser: AuthUser
217 :param repoid: Optional repository name or repository ID.
225 :param repoid: Optional repository name or repository ID.
218 :type repoid: str or int
226 :type repoid: str or int
219 :param pullrequestid: The pull request ID.
227 :param pullrequestid: The pull request ID.
220 :type pullrequestid: int
228 :type pullrequestid: int
221
229
222 Example output:
230 Example output:
223
231
224 .. code-block:: bash
232 .. code-block:: bash
225
233
226 id : <id_given_in_input>
234 id : <id_given_in_input>
227 result : [
235 result : [
228 {
236 {
229 "comment_author": {
237 "comment_author": {
230 "active": true,
238 "active": true,
231 "full_name_or_username": "Tom Gore",
239 "full_name_or_username": "Tom Gore",
232 "username": "admin"
240 "username": "admin"
233 },
241 },
234 "comment_created_on": "2017-01-02T18:43:45.533",
242 "comment_created_on": "2017-01-02T18:43:45.533",
235 "comment_f_path": null,
243 "comment_f_path": null,
236 "comment_id": 25,
244 "comment_id": 25,
237 "comment_lineno": null,
245 "comment_lineno": null,
238 "comment_status": {
246 "comment_status": {
239 "status": "under_review",
247 "status": "under_review",
240 "status_lbl": "Under Review"
248 "status_lbl": "Under Review"
241 },
249 },
242 "comment_text": "Example text",
250 "comment_text": "Example text",
243 "comment_type": null,
251 "comment_type": null,
244 "pull_request_version": null
252 "pull_request_version": null
245 }
253 }
246 ],
254 ],
247 error : null
255 error : null
248
256
249
257
250 get_pull_requests
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 Get all pull requests from the repository specified in `repoid`.
263 Get all pull requests from the repository specified in `repoid`.
256
264
257 :param apiuser: This is filled automatically from the |authtoken|.
265 :param apiuser: This is filled automatically from the |authtoken|.
258 :type apiuser: AuthUser
266 :type apiuser: AuthUser
259 :param repoid: Optional repository name or repository ID.
267 :param repoid: Optional repository name or repository ID.
260 :type repoid: str or int
268 :type repoid: str or int
261 :param status: Only return pull requests with the specified status.
269 :param status: Only return pull requests with the specified status.
262 Valid options are.
270 Valid options are.
263 * ``new`` (default)
271 * ``new`` (default)
264 * ``open``
272 * ``open``
265 * ``closed``
273 * ``closed``
266 :type status: str
274 :type status: str
267 :param merge_state: Optional calculate merge state for each repository.
275 :param merge_state: Optional calculate merge state for each repository.
268 This could result in longer time to fetch the data
276 This could result in longer time to fetch the data
269 :type merge_state: bool
277 :type merge_state: bool
270
278
271 Example output:
279 Example output:
272
280
273 .. code-block:: bash
281 .. code-block:: bash
274
282
275 "id": <id_given_in_input>,
283 "id": <id_given_in_input>,
276 "result":
284 "result":
277 [
285 [
278 ...
286 ...
279 {
287 {
280 "pull_request_id": "<pull_request_id>",
288 "pull_request_id": "<pull_request_id>",
281 "url": "<url>",
289 "url": "<url>",
282 "title" : "<title>",
290 "title" : "<title>",
283 "description": "<description>",
291 "description": "<description>",
284 "status": "<status>",
292 "status": "<status>",
285 "created_on": "<date_time_created>",
293 "created_on": "<date_time_created>",
286 "updated_on": "<date_time_updated>",
294 "updated_on": "<date_time_updated>",
287 "commit_ids": [
295 "commit_ids": [
288 ...
296 ...
289 "<commit_id>",
297 "<commit_id>",
290 "<commit_id>",
298 "<commit_id>",
291 ...
299 ...
292 ],
300 ],
293 "review_status": "<review_status>",
301 "review_status": "<review_status>",
294 "mergeable": {
302 "mergeable": {
295 "status": "<bool>",
303 "status": "<bool>",
296 "message: "<message>",
304 "message: "<message>",
297 },
305 },
298 "source": {
306 "source": {
299 "clone_url": "<clone_url>",
307 "clone_url": "<clone_url>",
300 "reference":
308 "reference":
301 {
309 {
302 "name": "<name>",
310 "name": "<name>",
303 "type": "<type>",
311 "type": "<type>",
304 "commit_id": "<commit_id>",
312 "commit_id": "<commit_id>",
305 }
313 }
306 },
314 },
307 "target": {
315 "target": {
308 "clone_url": "<clone_url>",
316 "clone_url": "<clone_url>",
309 "reference":
317 "reference":
310 {
318 {
311 "name": "<name>",
319 "name": "<name>",
312 "type": "<type>",
320 "type": "<type>",
313 "commit_id": "<commit_id>",
321 "commit_id": "<commit_id>",
314 }
322 }
315 },
323 },
316 "merge": {
324 "merge": {
317 "clone_url": "<clone_url>",
325 "clone_url": "<clone_url>",
318 "reference":
326 "reference":
319 {
327 {
320 "name": "<name>",
328 "name": "<name>",
321 "type": "<type>",
329 "type": "<type>",
322 "commit_id": "<commit_id>",
330 "commit_id": "<commit_id>",
323 }
331 }
324 },
332 },
325 "author": <user_obj>,
333 "author": <user_obj>,
326 "reviewers": [
334 "reviewers": [
327 ...
335 ...
328 {
336 {
329 "user": "<user_obj>",
337 "user": "<user_obj>",
330 "review_status": "<review_status>",
338 "review_status": "<review_status>",
331 }
339 }
332 ...
340 ...
333 ]
341 ]
334 }
342 }
335 ...
343 ...
336 ],
344 ],
337 "error": null
345 "error": null
338
346
339
347
340 merge_pull_request
348 merge_pull_request
341 ------------------
349 ------------------
342
350
343 .. py:function:: merge_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
351 .. py:function:: merge_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
344
352
345 Merge the pull request specified by `pullrequestid` into its target
353 Merge the pull request specified by `pullrequestid` into its target
346 repository.
354 repository.
347
355
348 :param apiuser: This is filled automatically from the |authtoken|.
356 :param apiuser: This is filled automatically from the |authtoken|.
349 :type apiuser: AuthUser
357 :type apiuser: AuthUser
350 :param repoid: Optional, repository name or repository ID of the
358 :param repoid: Optional, repository name or repository ID of the
351 target repository to which the |pr| is to be merged.
359 target repository to which the |pr| is to be merged.
352 :type repoid: str or int
360 :type repoid: str or int
353 :param pullrequestid: ID of the pull request which shall be merged.
361 :param pullrequestid: ID of the pull request which shall be merged.
354 :type pullrequestid: int
362 :type pullrequestid: int
355 :param userid: Merge the pull request as this user.
363 :param userid: Merge the pull request as this user.
356 :type userid: Optional(str or int)
364 :type userid: Optional(str or int)
357
365
358 Example output:
366 Example output:
359
367
360 .. code-block:: bash
368 .. code-block:: bash
361
369
362 "id": <id_given_in_input>,
370 "id": <id_given_in_input>,
363 "result": {
371 "result": {
364 "executed": "<bool>",
372 "executed": "<bool>",
365 "failure_reason": "<int>",
373 "failure_reason": "<int>",
366 "merge_status_message": "<str>",
374 "merge_status_message": "<str>",
367 "merge_commit_id": "<merge_commit_id>",
375 "merge_commit_id": "<merge_commit_id>",
368 "possible": "<bool>",
376 "possible": "<bool>",
369 "merge_ref": {
377 "merge_ref": {
370 "commit_id": "<commit_id>",
378 "commit_id": "<commit_id>",
371 "type": "<type>",
379 "type": "<type>",
372 "name": "<name>"
380 "name": "<name>"
373 }
381 }
374 },
382 },
375 "error": null
383 "error": null
376
384
377
385
378 update_pull_request
386 update_pull_request
379 -------------------
387 -------------------
380
388
381 .. py:function:: update_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>, update_commits=<Optional:None>)
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 Updates a pull request.
391 Updates a pull request.
384
392
385 :param apiuser: This is filled automatically from the |authtoken|.
393 :param apiuser: This is filled automatically from the |authtoken|.
386 :type apiuser: AuthUser
394 :type apiuser: AuthUser
387 :param repoid: Optional repository name or repository ID.
395 :param repoid: Optional repository name or repository ID.
388 :type repoid: str or int
396 :type repoid: str or int
389 :param pullrequestid: The pull request ID.
397 :param pullrequestid: The pull request ID.
390 :type pullrequestid: int
398 :type pullrequestid: int
391 :param title: Set the pull request title.
399 :param title: Set the pull request title.
392 :type title: str
400 :type title: str
393 :param description: Update pull request description.
401 :param description: Update pull request description.
394 :type description: Optional(str)
402 :type description: Optional(str)
395 :type description_renderer: Optional(str)
403 :type description_renderer: Optional(str)
396 :param description_renderer: Update pull request renderer for the description.
404 :param description_renderer: Update pull request renderer for the description.
397 It should be 'rst', 'markdown' or 'plain'
405 It should be 'rst', 'markdown' or 'plain'
398 :param reviewers: Update pull request reviewers list with new value.
406 :param reviewers: Update pull request reviewers list with new value.
399 :type reviewers: Optional(list)
407 :type reviewers: Optional(list)
400 Accepts username strings or objects of the format:
408 Accepts username strings or objects of the format:
401
409
402 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
410 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
403
411
404 :param update_commits: Trigger update of commits for this pull request
412 :param update_commits: Trigger update of commits for this pull request
405 :type: update_commits: Optional(bool)
413 :type: update_commits: Optional(bool)
406
414
407 Example output:
415 Example output:
408
416
409 .. code-block:: bash
417 .. code-block:: bash
410
418
411 id : <id_given_in_input>
419 id : <id_given_in_input>
412 result : {
420 result : {
413 "msg": "Updated pull request `63`",
421 "msg": "Updated pull request `63`",
414 "pull_request": <pull_request_object>,
422 "pull_request": <pull_request_object>,
415 "updated_reviewers": {
423 "updated_reviewers": {
416 "added": [
424 "added": [
417 "username"
425 "username"
418 ],
426 ],
419 "removed": []
427 "removed": []
420 },
428 },
421 "updated_commits": {
429 "updated_commits": {
422 "added": [
430 "added": [
423 "<sha1_hash>"
431 "<sha1_hash>"
424 ],
432 ],
425 "common": [
433 "common": [
426 "<sha1_hash>",
434 "<sha1_hash>",
427 "<sha1_hash>",
435 "<sha1_hash>",
428 ],
436 ],
429 "removed": []
437 "removed": []
430 }
438 }
431 }
439 }
432 error : null
440 error : null
433
441
434
442
@@ -1,1133 +1,1138 b''
1 .. _repo-methods-ref:
1 .. _repo-methods-ref:
2
2
3 repo methods
3 repo methods
4 ============
4 ============
5
5
6 add_field_to_repo
6 add_field_to_repo
7 -----------------
7 -----------------
8
8
9 .. py:function:: add_field_to_repo(apiuser, repoid, key, label=<Optional:''>, description=<Optional:''>)
9 .. py:function:: add_field_to_repo(apiuser, repoid, key, label=<Optional:''>, description=<Optional:''>)
10
10
11 Adds an extra field to a repository.
11 Adds an extra field to a repository.
12
12
13 This command can only be run using an |authtoken| with at least
13 This command can only be run using an |authtoken| with at least
14 write permissions to the |repo|.
14 write permissions to the |repo|.
15
15
16 :param apiuser: This is filled automatically from the |authtoken|.
16 :param apiuser: This is filled automatically from the |authtoken|.
17 :type apiuser: AuthUser
17 :type apiuser: AuthUser
18 :param repoid: Set the repository name or repository id.
18 :param repoid: Set the repository name or repository id.
19 :type repoid: str or int
19 :type repoid: str or int
20 :param key: Create a unique field key for this repository.
20 :param key: Create a unique field key for this repository.
21 :type key: str
21 :type key: str
22 :param label:
22 :param label:
23 :type label: Optional(str)
23 :type label: Optional(str)
24 :param description:
24 :param description:
25 :type description: Optional(str)
25 :type description: Optional(str)
26
26
27
27
28 comment_commit
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 Set a commit comment, and optionally change the status of the commit.
33 Set a commit comment, and optionally change the status of the commit.
34
34
35 :param apiuser: This is filled automatically from the |authtoken|.
35 :param apiuser: This is filled automatically from the |authtoken|.
36 :type apiuser: AuthUser
36 :type apiuser: AuthUser
37 :param repoid: Set the repository name or repository ID.
37 :param repoid: Set the repository name or repository ID.
38 :type repoid: str or int
38 :type repoid: str or int
39 :param commit_id: Specify the commit_id for which to set a comment.
39 :param commit_id: Specify the commit_id for which to set a comment.
40 :type commit_id: str
40 :type commit_id: str
41 :param message: The comment text.
41 :param message: The comment text.
42 :type message: str
42 :type message: str
43 :param status: (**Optional**) status of commit, one of: 'not_reviewed',
43 :param status: (**Optional**) status of commit, one of: 'not_reviewed',
44 'approved', 'rejected', 'under_review'
44 'approved', 'rejected', 'under_review'
45 :type status: str
45 :type status: str
46 :param comment_type: Comment type, one of: 'note', 'todo'
46 :param comment_type: Comment type, one of: 'note', 'todo'
47 :type comment_type: Optional(str), default: 'note'
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 :param userid: Set the user name of the comment creator.
53 :param userid: Set the user name of the comment creator.
49 :type userid: Optional(str or int)
54 :type userid: Optional(str or int)
50
55
51 Example error output:
56 Example error output:
52
57
53 .. code-block:: bash
58 .. code-block:: bash
54
59
55 {
60 {
56 "id" : <id_given_in_input>,
61 "id" : <id_given_in_input>,
57 "result" : {
62 "result" : {
58 "msg": "Commented on commit `<commit_id>` for repository `<repoid>`",
63 "msg": "Commented on commit `<commit_id>` for repository `<repoid>`",
59 "status_change": null or <status>,
64 "status_change": null or <status>,
60 "success": true
65 "success": true
61 },
66 },
62 "error" : null
67 "error" : null
63 }
68 }
64
69
65
70
66 create_repo
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 Creates a repository.
76 Creates a repository.
72
77
73 * If the repository name contains "/", repository will be created inside
78 * If the repository name contains "/", repository will be created inside
74 a repository group or nested repository groups
79 a repository group or nested repository groups
75
80
76 For example "foo/bar/repo1" will create |repo| called "repo1" inside
81 For example "foo/bar/repo1" will create |repo| called "repo1" inside
77 group "foo/bar". You have to have permissions to access and write to
82 group "foo/bar". You have to have permissions to access and write to
78 the last repository group ("bar" in this example)
83 the last repository group ("bar" in this example)
79
84
80 This command can only be run using an |authtoken| with at least
85 This command can only be run using an |authtoken| with at least
81 permissions to create repositories, or write permissions to
86 permissions to create repositories, or write permissions to
82 parent repository groups.
87 parent repository groups.
83
88
84 :param apiuser: This is filled automatically from the |authtoken|.
89 :param apiuser: This is filled automatically from the |authtoken|.
85 :type apiuser: AuthUser
90 :type apiuser: AuthUser
86 :param repo_name: Set the repository name.
91 :param repo_name: Set the repository name.
87 :type repo_name: str
92 :type repo_name: str
88 :param repo_type: Set the repository type; 'hg','git', or 'svn'.
93 :param repo_type: Set the repository type; 'hg','git', or 'svn'.
89 :type repo_type: str
94 :type repo_type: str
90 :param owner: user_id or username
95 :param owner: user_id or username
91 :type owner: Optional(str)
96 :type owner: Optional(str)
92 :param description: Set the repository description.
97 :param description: Set the repository description.
93 :type description: Optional(str)
98 :type description: Optional(str)
94 :param private: set repository as private
99 :param private: set repository as private
95 :type private: bool
100 :type private: bool
96 :param clone_uri: set clone_uri
101 :param clone_uri: set clone_uri
97 :type clone_uri: str
102 :type clone_uri: str
98 :param push_uri: set push_uri
103 :param push_uri: set push_uri
99 :type push_uri: str
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 :type landing_rev: str
106 :type landing_rev: str
102 :param enable_locking:
107 :param enable_locking:
103 :type enable_locking: bool
108 :type enable_locking: bool
104 :param enable_downloads:
109 :param enable_downloads:
105 :type enable_downloads: bool
110 :type enable_downloads: bool
106 :param enable_statistics:
111 :param enable_statistics:
107 :type enable_statistics: bool
112 :type enable_statistics: bool
108 :param copy_permissions: Copy permission from group in which the
113 :param copy_permissions: Copy permission from group in which the
109 repository is being created.
114 repository is being created.
110 :type copy_permissions: bool
115 :type copy_permissions: bool
111
116
112
117
113 Example output:
118 Example output:
114
119
115 .. code-block:: bash
120 .. code-block:: bash
116
121
117 id : <id_given_in_input>
122 id : <id_given_in_input>
118 result: {
123 result: {
119 "msg": "Created new repository `<reponame>`",
124 "msg": "Created new repository `<reponame>`",
120 "success": true,
125 "success": true,
121 "task": "<celery task id or None if done sync>"
126 "task": "<celery task id or None if done sync>"
122 }
127 }
123 error: null
128 error: null
124
129
125
130
126 Example error output:
131 Example error output:
127
132
128 .. code-block:: bash
133 .. code-block:: bash
129
134
130 id : <id_given_in_input>
135 id : <id_given_in_input>
131 result : null
136 result : null
132 error : {
137 error : {
133 'failed to create repository `<repo_name>`'
138 'failed to create repository `<repo_name>`'
134 }
139 }
135
140
136
141
137 delete_repo
142 delete_repo
138 -----------
143 -----------
139
144
140 .. py:function:: delete_repo(apiuser, repoid, forks=<Optional:''>)
145 .. py:function:: delete_repo(apiuser, repoid, forks=<Optional:''>)
141
146
142 Deletes a repository.
147 Deletes a repository.
143
148
144 * When the `forks` parameter is set it's possible to detach or delete
149 * When the `forks` parameter is set it's possible to detach or delete
145 forks of deleted repository.
150 forks of deleted repository.
146
151
147 This command can only be run using an |authtoken| with admin
152 This command can only be run using an |authtoken| with admin
148 permissions on the |repo|.
153 permissions on the |repo|.
149
154
150 :param apiuser: This is filled automatically from the |authtoken|.
155 :param apiuser: This is filled automatically from the |authtoken|.
151 :type apiuser: AuthUser
156 :type apiuser: AuthUser
152 :param repoid: Set the repository name or repository ID.
157 :param repoid: Set the repository name or repository ID.
153 :type repoid: str or int
158 :type repoid: str or int
154 :param forks: Set to `detach` or `delete` forks from the |repo|.
159 :param forks: Set to `detach` or `delete` forks from the |repo|.
155 :type forks: Optional(str)
160 :type forks: Optional(str)
156
161
157 Example error output:
162 Example error output:
158
163
159 .. code-block:: bash
164 .. code-block:: bash
160
165
161 id : <id_given_in_input>
166 id : <id_given_in_input>
162 result: {
167 result: {
163 "msg": "Deleted repository `<reponame>`",
168 "msg": "Deleted repository `<reponame>`",
164 "success": true
169 "success": true
165 }
170 }
166 error: null
171 error: null
167
172
168
173
169 fork_repo
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 Creates a fork of the specified |repo|.
179 Creates a fork of the specified |repo|.
175
180
176 * If the fork_name contains "/", fork will be created inside
181 * If the fork_name contains "/", fork will be created inside
177 a repository group or nested repository groups
182 a repository group or nested repository groups
178
183
179 For example "foo/bar/fork-repo" will create fork called "fork-repo"
184 For example "foo/bar/fork-repo" will create fork called "fork-repo"
180 inside group "foo/bar". You have to have permissions to access and
185 inside group "foo/bar". You have to have permissions to access and
181 write to the last repository group ("bar" in this example)
186 write to the last repository group ("bar" in this example)
182
187
183 This command can only be run using an |authtoken| with minimum
188 This command can only be run using an |authtoken| with minimum
184 read permissions of the forked repo, create fork permissions for an user.
189 read permissions of the forked repo, create fork permissions for an user.
185
190
186 :param apiuser: This is filled automatically from the |authtoken|.
191 :param apiuser: This is filled automatically from the |authtoken|.
187 :type apiuser: AuthUser
192 :type apiuser: AuthUser
188 :param repoid: Set repository name or repository ID.
193 :param repoid: Set repository name or repository ID.
189 :type repoid: str or int
194 :type repoid: str or int
190 :param fork_name: Set the fork name, including it's repository group membership.
195 :param fork_name: Set the fork name, including it's repository group membership.
191 :type fork_name: str
196 :type fork_name: str
192 :param owner: Set the fork owner.
197 :param owner: Set the fork owner.
193 :type owner: str
198 :type owner: str
194 :param description: Set the fork description.
199 :param description: Set the fork description.
195 :type description: str
200 :type description: str
196 :param copy_permissions: Copy permissions from parent |repo|. The
201 :param copy_permissions: Copy permissions from parent |repo|. The
197 default is False.
202 default is False.
198 :type copy_permissions: bool
203 :type copy_permissions: bool
199 :param private: Make the fork private. The default is False.
204 :param private: Make the fork private. The default is False.
200 :type private: bool
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 Example output:
208 Example output:
204
209
205 .. code-block:: bash
210 .. code-block:: bash
206
211
207 id : <id_for_response>
212 id : <id_for_response>
208 api_key : "<api_key>"
213 api_key : "<api_key>"
209 args: {
214 args: {
210 "repoid" : "<reponame or repo_id>",
215 "repoid" : "<reponame or repo_id>",
211 "fork_name": "<forkname>",
216 "fork_name": "<forkname>",
212 "owner": "<username or user_id = Optional(=apiuser)>",
217 "owner": "<username or user_id = Optional(=apiuser)>",
213 "description": "<description>",
218 "description": "<description>",
214 "copy_permissions": "<bool>",
219 "copy_permissions": "<bool>",
215 "private": "<bool>",
220 "private": "<bool>",
216 "landing_rev": "<landing_rev>"
221 "landing_rev": "<landing_rev>"
217 }
222 }
218
223
219 Example error output:
224 Example error output:
220
225
221 .. code-block:: bash
226 .. code-block:: bash
222
227
223 id : <id_given_in_input>
228 id : <id_given_in_input>
224 result: {
229 result: {
225 "msg": "Created fork of `<reponame>` as `<forkname>`",
230 "msg": "Created fork of `<reponame>` as `<forkname>`",
226 "success": true,
231 "success": true,
227 "task": "<celery task id or None if done sync>"
232 "task": "<celery task id or None if done sync>"
228 }
233 }
229 error: null
234 error: null
230
235
231
236
232 get_repo
237 get_repo
233 --------
238 --------
234
239
235 .. py:function:: get_repo(apiuser, repoid, cache=<Optional:True>)
240 .. py:function:: get_repo(apiuser, repoid, cache=<Optional:True>)
236
241
237 Gets an existing repository by its name or repository_id.
242 Gets an existing repository by its name or repository_id.
238
243
239 The members section so the output returns users groups or users
244 The members section so the output returns users groups or users
240 associated with that repository.
245 associated with that repository.
241
246
242 This command can only be run using an |authtoken| with admin rights,
247 This command can only be run using an |authtoken| with admin rights,
243 or users with at least read rights to the |repo|.
248 or users with at least read rights to the |repo|.
244
249
245 :param apiuser: This is filled automatically from the |authtoken|.
250 :param apiuser: This is filled automatically from the |authtoken|.
246 :type apiuser: AuthUser
251 :type apiuser: AuthUser
247 :param repoid: The repository name or repository id.
252 :param repoid: The repository name or repository id.
248 :type repoid: str or int
253 :type repoid: str or int
249 :param cache: use the cached value for last changeset
254 :param cache: use the cached value for last changeset
250 :type: cache: Optional(bool)
255 :type: cache: Optional(bool)
251
256
252 Example output:
257 Example output:
253
258
254 .. code-block:: bash
259 .. code-block:: bash
255
260
256 {
261 {
257 "error": null,
262 "error": null,
258 "id": <repo_id>,
263 "id": <repo_id>,
259 "result": {
264 "result": {
260 "clone_uri": null,
265 "clone_uri": null,
261 "created_on": "timestamp",
266 "created_on": "timestamp",
262 "description": "repo description",
267 "description": "repo description",
263 "enable_downloads": false,
268 "enable_downloads": false,
264 "enable_locking": false,
269 "enable_locking": false,
265 "enable_statistics": false,
270 "enable_statistics": false,
266 "followers": [
271 "followers": [
267 {
272 {
268 "active": true,
273 "active": true,
269 "admin": false,
274 "admin": false,
270 "api_key": "****************************************",
275 "api_key": "****************************************",
271 "api_keys": [
276 "api_keys": [
272 "****************************************"
277 "****************************************"
273 ],
278 ],
274 "email": "user@example.com",
279 "email": "user@example.com",
275 "emails": [
280 "emails": [
276 "user@example.com"
281 "user@example.com"
277 ],
282 ],
278 "extern_name": "rhodecode",
283 "extern_name": "rhodecode",
279 "extern_type": "rhodecode",
284 "extern_type": "rhodecode",
280 "firstname": "username",
285 "firstname": "username",
281 "ip_addresses": [],
286 "ip_addresses": [],
282 "language": null,
287 "language": null,
283 "last_login": "2015-09-16T17:16:35.854",
288 "last_login": "2015-09-16T17:16:35.854",
284 "lastname": "surname",
289 "lastname": "surname",
285 "user_id": <user_id>,
290 "user_id": <user_id>,
286 "username": "name"
291 "username": "name"
287 }
292 }
288 ],
293 ],
289 "fork_of": "parent-repo",
294 "fork_of": "parent-repo",
290 "landing_rev": [
295 "landing_rev": [
291 "rev",
296 "rev",
292 "tip"
297 "tip"
293 ],
298 ],
294 "last_changeset": {
299 "last_changeset": {
295 "author": "User <user@example.com>",
300 "author": "User <user@example.com>",
296 "branch": "default",
301 "branch": "default",
297 "date": "timestamp",
302 "date": "timestamp",
298 "message": "last commit message",
303 "message": "last commit message",
299 "parents": [
304 "parents": [
300 {
305 {
301 "raw_id": "commit-id"
306 "raw_id": "commit-id"
302 }
307 }
303 ],
308 ],
304 "raw_id": "commit-id",
309 "raw_id": "commit-id",
305 "revision": <revision number>,
310 "revision": <revision number>,
306 "short_id": "short id"
311 "short_id": "short id"
307 },
312 },
308 "lock_reason": null,
313 "lock_reason": null,
309 "locked_by": null,
314 "locked_by": null,
310 "locked_date": null,
315 "locked_date": null,
311 "owner": "owner-name",
316 "owner": "owner-name",
312 "permissions": [
317 "permissions": [
313 {
318 {
314 "name": "super-admin-name",
319 "name": "super-admin-name",
315 "origin": "super-admin",
320 "origin": "super-admin",
316 "permission": "repository.admin",
321 "permission": "repository.admin",
317 "type": "user"
322 "type": "user"
318 },
323 },
319 {
324 {
320 "name": "owner-name",
325 "name": "owner-name",
321 "origin": "owner",
326 "origin": "owner",
322 "permission": "repository.admin",
327 "permission": "repository.admin",
323 "type": "user"
328 "type": "user"
324 },
329 },
325 {
330 {
326 "name": "user-group-name",
331 "name": "user-group-name",
327 "origin": "permission",
332 "origin": "permission",
328 "permission": "repository.write",
333 "permission": "repository.write",
329 "type": "user_group"
334 "type": "user_group"
330 }
335 }
331 ],
336 ],
332 "private": true,
337 "private": true,
333 "repo_id": 676,
338 "repo_id": 676,
334 "repo_name": "user-group/repo-name",
339 "repo_name": "user-group/repo-name",
335 "repo_type": "hg"
340 "repo_type": "hg"
336 }
341 }
337 }
342 }
338
343
339
344
340 get_repo_changeset
345 get_repo_changeset
341 ------------------
346 ------------------
342
347
343 .. py:function:: get_repo_changeset(apiuser, repoid, revision, details=<Optional:'basic'>)
348 .. py:function:: get_repo_changeset(apiuser, repoid, revision, details=<Optional:'basic'>)
344
349
345 Returns information about a changeset.
350 Returns information about a changeset.
346
351
347 Additionally parameters define the amount of details returned by
352 Additionally parameters define the amount of details returned by
348 this function.
353 this function.
349
354
350 This command can only be run using an |authtoken| with admin rights,
355 This command can only be run using an |authtoken| with admin rights,
351 or users with at least read rights to the |repo|.
356 or users with at least read rights to the |repo|.
352
357
353 :param apiuser: This is filled automatically from the |authtoken|.
358 :param apiuser: This is filled automatically from the |authtoken|.
354 :type apiuser: AuthUser
359 :type apiuser: AuthUser
355 :param repoid: The repository name or repository id
360 :param repoid: The repository name or repository id
356 :type repoid: str or int
361 :type repoid: str or int
357 :param revision: revision for which listing should be done
362 :param revision: revision for which listing should be done
358 :type revision: str
363 :type revision: str
359 :param details: details can be 'basic|extended|full' full gives diff
364 :param details: details can be 'basic|extended|full' full gives diff
360 info details like the diff itself, and number of changed files etc.
365 info details like the diff itself, and number of changed files etc.
361 :type details: Optional(str)
366 :type details: Optional(str)
362
367
363
368
364 get_repo_changesets
369 get_repo_changesets
365 -------------------
370 -------------------
366
371
367 .. py:function:: get_repo_changesets(apiuser, repoid, start_rev, limit, details=<Optional:'basic'>)
372 .. py:function:: get_repo_changesets(apiuser, repoid, start_rev, limit, details=<Optional:'basic'>)
368
373
369 Returns a set of commits limited by the number starting
374 Returns a set of commits limited by the number starting
370 from the `start_rev` option.
375 from the `start_rev` option.
371
376
372 Additional parameters define the amount of details returned by this
377 Additional parameters define the amount of details returned by this
373 function.
378 function.
374
379
375 This command can only be run using an |authtoken| with admin rights,
380 This command can only be run using an |authtoken| with admin rights,
376 or users with at least read rights to |repos|.
381 or users with at least read rights to |repos|.
377
382
378 :param apiuser: This is filled automatically from the |authtoken|.
383 :param apiuser: This is filled automatically from the |authtoken|.
379 :type apiuser: AuthUser
384 :type apiuser: AuthUser
380 :param repoid: The repository name or repository ID.
385 :param repoid: The repository name or repository ID.
381 :type repoid: str or int
386 :type repoid: str or int
382 :param start_rev: The starting revision from where to get changesets.
387 :param start_rev: The starting revision from where to get changesets.
383 :type start_rev: str
388 :type start_rev: str
384 :param limit: Limit the number of commits to this amount
389 :param limit: Limit the number of commits to this amount
385 :type limit: str or int
390 :type limit: str or int
386 :param details: Set the level of detail returned. Valid option are:
391 :param details: Set the level of detail returned. Valid option are:
387 ``basic``, ``extended`` and ``full``.
392 ``basic``, ``extended`` and ``full``.
388 :type details: Optional(str)
393 :type details: Optional(str)
389
394
390 .. note::
395 .. note::
391
396
392 Setting the parameter `details` to the value ``full`` is extensive
397 Setting the parameter `details` to the value ``full`` is extensive
393 and returns details like the diff itself, and the number
398 and returns details like the diff itself, and the number
394 of changed files.
399 of changed files.
395
400
396
401
397 get_repo_comments
402 get_repo_comments
398 -----------------
403 -----------------
399
404
400 .. py:function:: get_repo_comments(apiuser, repoid, commit_id=<Optional:None>, comment_type=<Optional:None>, userid=<Optional:None>)
405 .. py:function:: get_repo_comments(apiuser, repoid, commit_id=<Optional:None>, comment_type=<Optional:None>, userid=<Optional:None>)
401
406
402 Get all comments for a repository
407 Get all comments for a repository
403
408
404 :param apiuser: This is filled automatically from the |authtoken|.
409 :param apiuser: This is filled automatically from the |authtoken|.
405 :type apiuser: AuthUser
410 :type apiuser: AuthUser
406 :param repoid: Set the repository name or repository ID.
411 :param repoid: Set the repository name or repository ID.
407 :type repoid: str or int
412 :type repoid: str or int
408 :param commit_id: Optionally filter the comments by the commit_id
413 :param commit_id: Optionally filter the comments by the commit_id
409 :type commit_id: Optional(str), default: None
414 :type commit_id: Optional(str), default: None
410 :param comment_type: Optionally filter the comments by the comment_type
415 :param comment_type: Optionally filter the comments by the comment_type
411 one of: 'note', 'todo'
416 one of: 'note', 'todo'
412 :type comment_type: Optional(str), default: None
417 :type comment_type: Optional(str), default: None
413 :param userid: Optionally filter the comments by the author of comment
418 :param userid: Optionally filter the comments by the author of comment
414 :type userid: Optional(str or int), Default: None
419 :type userid: Optional(str or int), Default: None
415
420
416 Example error output:
421 Example error output:
417
422
418 .. code-block:: bash
423 .. code-block:: bash
419
424
420 {
425 {
421 "id" : <id_given_in_input>,
426 "id" : <id_given_in_input>,
422 "result" : [
427 "result" : [
423 {
428 {
424 "comment_author": <USER_DETAILS>,
429 "comment_author": <USER_DETAILS>,
425 "comment_created_on": "2017-02-01T14:38:16.309",
430 "comment_created_on": "2017-02-01T14:38:16.309",
426 "comment_f_path": "file.txt",
431 "comment_f_path": "file.txt",
427 "comment_id": 282,
432 "comment_id": 282,
428 "comment_lineno": "n1",
433 "comment_lineno": "n1",
429 "comment_resolved_by": null,
434 "comment_resolved_by": null,
430 "comment_status": [],
435 "comment_status": [],
431 "comment_text": "This file needs a header",
436 "comment_text": "This file needs a header",
432 "comment_type": "todo"
437 "comment_type": "todo"
433 }
438 }
434 ],
439 ],
435 "error" : null
440 "error" : null
436 }
441 }
437
442
438
443
439 get_repo_file
444 get_repo_file
440 -------------
445 -------------
441
446
442 .. py:function:: get_repo_file(apiuser, repoid, commit_id, file_path, max_file_bytes=<Optional:None>, details=<Optional:'basic'>, cache=<Optional:True>)
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 Returns a single file from repository at given revision.
449 Returns a single file from repository at given revision.
445
450
446 This command can only be run using an |authtoken| with admin rights,
451 This command can only be run using an |authtoken| with admin rights,
447 or users with at least read rights to |repos|.
452 or users with at least read rights to |repos|.
448
453
449 :param apiuser: This is filled automatically from the |authtoken|.
454 :param apiuser: This is filled automatically from the |authtoken|.
450 :type apiuser: AuthUser
455 :type apiuser: AuthUser
451 :param repoid: The repository name or repository ID.
456 :param repoid: The repository name or repository ID.
452 :type repoid: str or int
457 :type repoid: str or int
453 :param commit_id: The revision for which listing should be done.
458 :param commit_id: The revision for which listing should be done.
454 :type commit_id: str
459 :type commit_id: str
455 :param file_path: The path from which to start displaying.
460 :param file_path: The path from which to start displaying.
456 :type file_path: str
461 :type file_path: str
457 :param details: Returns different set of information about nodes.
462 :param details: Returns different set of information about nodes.
458 The valid options are ``minimal`` ``basic`` and ``full``.
463 The valid options are ``minimal`` ``basic`` and ``full``.
459 :type details: Optional(str)
464 :type details: Optional(str)
460 :param max_file_bytes: Only return file content under this file size bytes
465 :param max_file_bytes: Only return file content under this file size bytes
461 :type max_file_bytes: Optional(int)
466 :type max_file_bytes: Optional(int)
462 :param cache: Use internal caches for fetching files. If disabled fetching
467 :param cache: Use internal caches for fetching files. If disabled fetching
463 files is slower but more memory efficient
468 files is slower but more memory efficient
464 :type cache: Optional(bool)
469 :type cache: Optional(bool)
465
470
466 Example output:
471 Example output:
467
472
468 .. code-block:: bash
473 .. code-block:: bash
469
474
470 id : <id_given_in_input>
475 id : <id_given_in_input>
471 result: {
476 result: {
472 "binary": false,
477 "binary": false,
473 "extension": "py",
478 "extension": "py",
474 "lines": 35,
479 "lines": 35,
475 "content": "....",
480 "content": "....",
476 "md5": "76318336366b0f17ee249e11b0c99c41",
481 "md5": "76318336366b0f17ee249e11b0c99c41",
477 "mimetype": "text/x-python",
482 "mimetype": "text/x-python",
478 "name": "python.py",
483 "name": "python.py",
479 "size": 817,
484 "size": 817,
480 "type": "file",
485 "type": "file",
481 }
486 }
482 error: null
487 error: null
483
488
484
489
485 get_repo_fts_tree
490 get_repo_fts_tree
486 -----------------
491 -----------------
487
492
488 .. py:function:: get_repo_fts_tree(apiuser, repoid, commit_id, root_path)
493 .. py:function:: get_repo_fts_tree(apiuser, repoid, commit_id, root_path)
489
494
490 Returns a list of tree nodes for path at given revision. This api is built
495 Returns a list of tree nodes for path at given revision. This api is built
491 strictly for usage in full text search building, and shouldn't be consumed
496 strictly for usage in full text search building, and shouldn't be consumed
492
497
493 This command can only be run using an |authtoken| with admin rights,
498 This command can only be run using an |authtoken| with admin rights,
494 or users with at least read rights to |repos|.
499 or users with at least read rights to |repos|.
495
500
496
501
497 get_repo_nodes
502 get_repo_nodes
498 --------------
503 --------------
499
504
500 .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>, max_file_bytes=<Optional:None>)
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 Returns a list of nodes and children in a flat list for a given
507 Returns a list of nodes and children in a flat list for a given
503 path at given revision.
508 path at given revision.
504
509
505 It's possible to specify ret_type to show only `files` or `dirs`.
510 It's possible to specify ret_type to show only `files` or `dirs`.
506
511
507 This command can only be run using an |authtoken| with admin rights,
512 This command can only be run using an |authtoken| with admin rights,
508 or users with at least read rights to |repos|.
513 or users with at least read rights to |repos|.
509
514
510 :param apiuser: This is filled automatically from the |authtoken|.
515 :param apiuser: This is filled automatically from the |authtoken|.
511 :type apiuser: AuthUser
516 :type apiuser: AuthUser
512 :param repoid: The repository name or repository ID.
517 :param repoid: The repository name or repository ID.
513 :type repoid: str or int
518 :type repoid: str or int
514 :param revision: The revision for which listing should be done.
519 :param revision: The revision for which listing should be done.
515 :type revision: str
520 :type revision: str
516 :param root_path: The path from which to start displaying.
521 :param root_path: The path from which to start displaying.
517 :type root_path: str
522 :type root_path: str
518 :param ret_type: Set the return type. Valid options are
523 :param ret_type: Set the return type. Valid options are
519 ``all`` (default), ``files`` and ``dirs``.
524 ``all`` (default), ``files`` and ``dirs``.
520 :type ret_type: Optional(str)
525 :type ret_type: Optional(str)
521 :param details: Returns extended information about nodes, such as
526 :param details: Returns extended information about nodes, such as
522 md5, binary, and or content.
527 md5, binary, and or content.
523 The valid options are ``basic`` and ``full``.
528 The valid options are ``basic`` and ``full``.
524 :type details: Optional(str)
529 :type details: Optional(str)
525 :param max_file_bytes: Only return file content under this file size bytes
530 :param max_file_bytes: Only return file content under this file size bytes
526 :type details: Optional(int)
531 :type details: Optional(int)
527
532
528 Example output:
533 Example output:
529
534
530 .. code-block:: bash
535 .. code-block:: bash
531
536
532 id : <id_given_in_input>
537 id : <id_given_in_input>
533 result: [
538 result: [
534 {
539 {
535 "binary": false,
540 "binary": false,
536 "content": "File line",
541 "content": "File line",
537 "extension": "md",
542 "extension": "md",
538 "lines": 2,
543 "lines": 2,
539 "md5": "059fa5d29b19c0657e384749480f6422",
544 "md5": "059fa5d29b19c0657e384749480f6422",
540 "mimetype": "text/x-minidsrc",
545 "mimetype": "text/x-minidsrc",
541 "name": "file.md",
546 "name": "file.md",
542 "size": 580,
547 "size": 580,
543 "type": "file"
548 "type": "file"
544 },
549 },
545 ...
550 ...
546 ]
551 ]
547 error: null
552 error: null
548
553
549
554
550 get_repo_refs
555 get_repo_refs
551 -------------
556 -------------
552
557
553 .. py:function:: get_repo_refs(apiuser, repoid)
558 .. py:function:: get_repo_refs(apiuser, repoid)
554
559
555 Returns a dictionary of current references. It returns
560 Returns a dictionary of current references. It returns
556 bookmarks, branches, closed_branches, and tags for given repository
561 bookmarks, branches, closed_branches, and tags for given repository
557
562
558 It's possible to specify ret_type to show only `files` or `dirs`.
563 It's possible to specify ret_type to show only `files` or `dirs`.
559
564
560 This command can only be run using an |authtoken| with admin rights,
565 This command can only be run using an |authtoken| with admin rights,
561 or users with at least read rights to |repos|.
566 or users with at least read rights to |repos|.
562
567
563 :param apiuser: This is filled automatically from the |authtoken|.
568 :param apiuser: This is filled automatically from the |authtoken|.
564 :type apiuser: AuthUser
569 :type apiuser: AuthUser
565 :param repoid: The repository name or repository ID.
570 :param repoid: The repository name or repository ID.
566 :type repoid: str or int
571 :type repoid: str or int
567
572
568 Example output:
573 Example output:
569
574
570 .. code-block:: bash
575 .. code-block:: bash
571
576
572 id : <id_given_in_input>
577 id : <id_given_in_input>
573 "result": {
578 "result": {
574 "bookmarks": {
579 "bookmarks": {
575 "dev": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
580 "dev": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
576 "master": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
581 "master": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
577 },
582 },
578 "branches": {
583 "branches": {
579 "default": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
584 "default": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
580 "stable": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
585 "stable": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
581 },
586 },
582 "branches_closed": {},
587 "branches_closed": {},
583 "tags": {
588 "tags": {
584 "tip": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
589 "tip": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
585 "v4.4.0": "1232313f9e6adac5ce5399c2a891dc1e72b79022",
590 "v4.4.0": "1232313f9e6adac5ce5399c2a891dc1e72b79022",
586 "v4.4.1": "cbb9f1d329ae5768379cdec55a62ebdd546c4e27",
591 "v4.4.1": "cbb9f1d329ae5768379cdec55a62ebdd546c4e27",
587 "v4.4.2": "24ffe44a27fcd1c5b6936144e176b9f6dd2f3a17",
592 "v4.4.2": "24ffe44a27fcd1c5b6936144e176b9f6dd2f3a17",
588 }
593 }
589 }
594 }
590 error: null
595 error: null
591
596
592
597
593 get_repo_settings
598 get_repo_settings
594 -----------------
599 -----------------
595
600
596 .. py:function:: get_repo_settings(apiuser, repoid, key=<Optional:None>)
601 .. py:function:: get_repo_settings(apiuser, repoid, key=<Optional:None>)
597
602
598 Returns all settings for a repository. If key is given it only returns the
603 Returns all settings for a repository. If key is given it only returns the
599 setting identified by the key or null.
604 setting identified by the key or null.
600
605
601 :param apiuser: This is filled automatically from the |authtoken|.
606 :param apiuser: This is filled automatically from the |authtoken|.
602 :type apiuser: AuthUser
607 :type apiuser: AuthUser
603 :param repoid: The repository name or repository id.
608 :param repoid: The repository name or repository id.
604 :type repoid: str or int
609 :type repoid: str or int
605 :param key: Key of the setting to return.
610 :param key: Key of the setting to return.
606 :type: key: Optional(str)
611 :type: key: Optional(str)
607
612
608 Example output:
613 Example output:
609
614
610 .. code-block:: bash
615 .. code-block:: bash
611
616
612 {
617 {
613 "error": null,
618 "error": null,
614 "id": 237,
619 "id": 237,
615 "result": {
620 "result": {
616 "extensions_largefiles": true,
621 "extensions_largefiles": true,
617 "extensions_evolve": true,
622 "extensions_evolve": true,
618 "hooks_changegroup_push_logger": true,
623 "hooks_changegroup_push_logger": true,
619 "hooks_changegroup_repo_size": false,
624 "hooks_changegroup_repo_size": false,
620 "hooks_outgoing_pull_logger": true,
625 "hooks_outgoing_pull_logger": true,
621 "phases_publish": "True",
626 "phases_publish": "True",
622 "rhodecode_hg_use_rebase_for_merging": true,
627 "rhodecode_hg_use_rebase_for_merging": true,
623 "rhodecode_pr_merge_enabled": true,
628 "rhodecode_pr_merge_enabled": true,
624 "rhodecode_use_outdated_comments": true
629 "rhodecode_use_outdated_comments": true
625 }
630 }
626 }
631 }
627
632
628
633
629 get_repos
634 get_repos
630 ---------
635 ---------
631
636
632 .. py:function:: get_repos(apiuser, root=<Optional:None>, traverse=<Optional:True>)
637 .. py:function:: get_repos(apiuser, root=<Optional:None>, traverse=<Optional:True>)
633
638
634 Lists all existing repositories.
639 Lists all existing repositories.
635
640
636 This command can only be run using an |authtoken| with admin rights,
641 This command can only be run using an |authtoken| with admin rights,
637 or users with at least read rights to |repos|.
642 or users with at least read rights to |repos|.
638
643
639 :param apiuser: This is filled automatically from the |authtoken|.
644 :param apiuser: This is filled automatically from the |authtoken|.
640 :type apiuser: AuthUser
645 :type apiuser: AuthUser
641 :param root: specify root repository group to fetch repositories.
646 :param root: specify root repository group to fetch repositories.
642 filters the returned repositories to be members of given root group.
647 filters the returned repositories to be members of given root group.
643 :type root: Optional(None)
648 :type root: Optional(None)
644 :param traverse: traverse given root into subrepositories. With this flag
649 :param traverse: traverse given root into subrepositories. With this flag
645 set to False, it will only return top-level repositories from `root`.
650 set to False, it will only return top-level repositories from `root`.
646 if root is empty it will return just top-level repositories.
651 if root is empty it will return just top-level repositories.
647 :type traverse: Optional(True)
652 :type traverse: Optional(True)
648
653
649
654
650 Example output:
655 Example output:
651
656
652 .. code-block:: bash
657 .. code-block:: bash
653
658
654 id : <id_given_in_input>
659 id : <id_given_in_input>
655 result: [
660 result: [
656 {
661 {
657 "repo_id" : "<repo_id>",
662 "repo_id" : "<repo_id>",
658 "repo_name" : "<reponame>"
663 "repo_name" : "<reponame>"
659 "repo_type" : "<repo_type>",
664 "repo_type" : "<repo_type>",
660 "clone_uri" : "<clone_uri>",
665 "clone_uri" : "<clone_uri>",
661 "private": : "<bool>",
666 "private": : "<bool>",
662 "created_on" : "<datetimecreated>",
667 "created_on" : "<datetimecreated>",
663 "description" : "<description>",
668 "description" : "<description>",
664 "landing_rev": "<landing_rev>",
669 "landing_rev": "<landing_rev>",
665 "owner": "<repo_owner>",
670 "owner": "<repo_owner>",
666 "fork_of": "<name_of_fork_parent>",
671 "fork_of": "<name_of_fork_parent>",
667 "enable_downloads": "<bool>",
672 "enable_downloads": "<bool>",
668 "enable_locking": "<bool>",
673 "enable_locking": "<bool>",
669 "enable_statistics": "<bool>",
674 "enable_statistics": "<bool>",
670 },
675 },
671 ...
676 ...
672 ]
677 ]
673 error: null
678 error: null
674
679
675
680
676 grant_user_group_permission
681 grant_user_group_permission
677 ---------------------------
682 ---------------------------
678
683
679 .. py:function:: grant_user_group_permission(apiuser, repoid, usergroupid, perm)
684 .. py:function:: grant_user_group_permission(apiuser, repoid, usergroupid, perm)
680
685
681 Grant permission for a user group on the specified repository,
686 Grant permission for a user group on the specified repository,
682 or update existing permissions.
687 or update existing permissions.
683
688
684 This command can only be run using an |authtoken| with admin
689 This command can only be run using an |authtoken| with admin
685 permissions on the |repo|.
690 permissions on the |repo|.
686
691
687 :param apiuser: This is filled automatically from the |authtoken|.
692 :param apiuser: This is filled automatically from the |authtoken|.
688 :type apiuser: AuthUser
693 :type apiuser: AuthUser
689 :param repoid: Set the repository name or repository ID.
694 :param repoid: Set the repository name or repository ID.
690 :type repoid: str or int
695 :type repoid: str or int
691 :param usergroupid: Specify the ID of the user group.
696 :param usergroupid: Specify the ID of the user group.
692 :type usergroupid: str or int
697 :type usergroupid: str or int
693 :param perm: Set the user group permissions using the following
698 :param perm: Set the user group permissions using the following
694 format: (repository.(none|read|write|admin))
699 format: (repository.(none|read|write|admin))
695 :type perm: str
700 :type perm: str
696
701
697 Example output:
702 Example output:
698
703
699 .. code-block:: bash
704 .. code-block:: bash
700
705
701 id : <id_given_in_input>
706 id : <id_given_in_input>
702 result : {
707 result : {
703 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
708 "msg" : "Granted perm: `<perm>` for group: `<usersgroupname>` in repo: `<reponame>`",
704 "success": true
709 "success": true
705
710
706 }
711 }
707 error : null
712 error : null
708
713
709 Example error output:
714 Example error output:
710
715
711 .. code-block:: bash
716 .. code-block:: bash
712
717
713 id : <id_given_in_input>
718 id : <id_given_in_input>
714 result : null
719 result : null
715 error : {
720 error : {
716 "failed to edit permission for user group: `<usergroup>` in repo `<repo>`'
721 "failed to edit permission for user group: `<usergroup>` in repo `<repo>`'
717 }
722 }
718
723
719
724
720 grant_user_permission
725 grant_user_permission
721 ---------------------
726 ---------------------
722
727
723 .. py:function:: grant_user_permission(apiuser, repoid, userid, perm)
728 .. py:function:: grant_user_permission(apiuser, repoid, userid, perm)
724
729
725 Grant permissions for the specified user on the given repository,
730 Grant permissions for the specified user on the given repository,
726 or update existing permissions if found.
731 or update existing permissions if found.
727
732
728 This command can only be run using an |authtoken| with admin
733 This command can only be run using an |authtoken| with admin
729 permissions on the |repo|.
734 permissions on the |repo|.
730
735
731 :param apiuser: This is filled automatically from the |authtoken|.
736 :param apiuser: This is filled automatically from the |authtoken|.
732 :type apiuser: AuthUser
737 :type apiuser: AuthUser
733 :param repoid: Set the repository name or repository ID.
738 :param repoid: Set the repository name or repository ID.
734 :type repoid: str or int
739 :type repoid: str or int
735 :param userid: Set the user name.
740 :param userid: Set the user name.
736 :type userid: str
741 :type userid: str
737 :param perm: Set the user permissions, using the following format
742 :param perm: Set the user permissions, using the following format
738 ``(repository.(none|read|write|admin))``
743 ``(repository.(none|read|write|admin))``
739 :type perm: str
744 :type perm: str
740
745
741 Example output:
746 Example output:
742
747
743 .. code-block:: bash
748 .. code-block:: bash
744
749
745 id : <id_given_in_input>
750 id : <id_given_in_input>
746 result: {
751 result: {
747 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
752 "msg" : "Granted perm: `<perm>` for user: `<username>` in repo: `<reponame>`",
748 "success": true
753 "success": true
749 }
754 }
750 error: null
755 error: null
751
756
752
757
753 invalidate_cache
758 invalidate_cache
754 ----------------
759 ----------------
755
760
756 .. py:function:: invalidate_cache(apiuser, repoid, delete_keys=<Optional:False>)
761 .. py:function:: invalidate_cache(apiuser, repoid, delete_keys=<Optional:False>)
757
762
758 Invalidates the cache for the specified repository.
763 Invalidates the cache for the specified repository.
759
764
760 This command can only be run using an |authtoken| with admin rights to
765 This command can only be run using an |authtoken| with admin rights to
761 the specified repository.
766 the specified repository.
762
767
763 This command takes the following options:
768 This command takes the following options:
764
769
765 :param apiuser: This is filled automatically from |authtoken|.
770 :param apiuser: This is filled automatically from |authtoken|.
766 :type apiuser: AuthUser
771 :type apiuser: AuthUser
767 :param repoid: Sets the repository name or repository ID.
772 :param repoid: Sets the repository name or repository ID.
768 :type repoid: str or int
773 :type repoid: str or int
769 :param delete_keys: This deletes the invalidated keys instead of
774 :param delete_keys: This deletes the invalidated keys instead of
770 just flagging them.
775 just flagging them.
771 :type delete_keys: Optional(``True`` | ``False``)
776 :type delete_keys: Optional(``True`` | ``False``)
772
777
773 Example output:
778 Example output:
774
779
775 .. code-block:: bash
780 .. code-block:: bash
776
781
777 id : <id_given_in_input>
782 id : <id_given_in_input>
778 result : {
783 result : {
779 'msg': Cache for repository `<repository name>` was invalidated,
784 'msg': Cache for repository `<repository name>` was invalidated,
780 'repository': <repository name>
785 'repository': <repository name>
781 }
786 }
782 error : null
787 error : null
783
788
784 Example error output:
789 Example error output:
785
790
786 .. code-block:: bash
791 .. code-block:: bash
787
792
788 id : <id_given_in_input>
793 id : <id_given_in_input>
789 result : null
794 result : null
790 error : {
795 error : {
791 'Error occurred during cache invalidation action'
796 'Error occurred during cache invalidation action'
792 }
797 }
793
798
794
799
795 lock
800 lock
796 ----
801 ----
797
802
798 .. py:function:: lock(apiuser, repoid, locked=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
803 .. py:function:: lock(apiuser, repoid, locked=<Optional:None>, userid=<Optional:<OptionalAttr:apiuser>>)
799
804
800 Sets the lock state of the specified |repo| by the given user.
805 Sets the lock state of the specified |repo| by the given user.
801 From more information, see :ref:`repo-locking`.
806 From more information, see :ref:`repo-locking`.
802
807
803 * If the ``userid`` option is not set, the repository is locked to the
808 * If the ``userid`` option is not set, the repository is locked to the
804 user who called the method.
809 user who called the method.
805 * If the ``locked`` parameter is not set, the current lock state of the
810 * If the ``locked`` parameter is not set, the current lock state of the
806 repository is displayed.
811 repository is displayed.
807
812
808 This command can only be run using an |authtoken| with admin rights to
813 This command can only be run using an |authtoken| with admin rights to
809 the specified repository.
814 the specified repository.
810
815
811 This command takes the following options:
816 This command takes the following options:
812
817
813 :param apiuser: This is filled automatically from the |authtoken|.
818 :param apiuser: This is filled automatically from the |authtoken|.
814 :type apiuser: AuthUser
819 :type apiuser: AuthUser
815 :param repoid: Sets the repository name or repository ID.
820 :param repoid: Sets the repository name or repository ID.
816 :type repoid: str or int
821 :type repoid: str or int
817 :param locked: Sets the lock state.
822 :param locked: Sets the lock state.
818 :type locked: Optional(``True`` | ``False``)
823 :type locked: Optional(``True`` | ``False``)
819 :param userid: Set the repository lock to this user.
824 :param userid: Set the repository lock to this user.
820 :type userid: Optional(str or int)
825 :type userid: Optional(str or int)
821
826
822 Example error output:
827 Example error output:
823
828
824 .. code-block:: bash
829 .. code-block:: bash
825
830
826 id : <id_given_in_input>
831 id : <id_given_in_input>
827 result : {
832 result : {
828 'repo': '<reponame>',
833 'repo': '<reponame>',
829 'locked': <bool: lock state>,
834 'locked': <bool: lock state>,
830 'locked_since': <int: lock timestamp>,
835 'locked_since': <int: lock timestamp>,
831 'locked_by': <username of person who made the lock>,
836 'locked_by': <username of person who made the lock>,
832 'lock_reason': <str: reason for locking>,
837 'lock_reason': <str: reason for locking>,
833 'lock_state_changed': <bool: True if lock state has been changed in this request>,
838 'lock_state_changed': <bool: True if lock state has been changed in this request>,
834 'msg': 'Repo `<reponame>` locked by `<username>` on <timestamp>.'
839 'msg': 'Repo `<reponame>` locked by `<username>` on <timestamp>.'
835 or
840 or
836 'msg': 'Repo `<repository name>` not locked.'
841 'msg': 'Repo `<repository name>` not locked.'
837 or
842 or
838 'msg': 'User `<user name>` set lock state for repo `<repository name>` to `<new lock state>`'
843 'msg': 'User `<user name>` set lock state for repo `<repository name>` to `<new lock state>`'
839 }
844 }
840 error : null
845 error : null
841
846
842 Example error output:
847 Example error output:
843
848
844 .. code-block:: bash
849 .. code-block:: bash
845
850
846 id : <id_given_in_input>
851 id : <id_given_in_input>
847 result : null
852 result : null
848 error : {
853 error : {
849 'Error occurred locking repository `<reponame>`'
854 'Error occurred locking repository `<reponame>`'
850 }
855 }
851
856
852
857
853 maintenance
858 maintenance
854 -----------
859 -----------
855
860
856 .. py:function:: maintenance(apiuser, repoid)
861 .. py:function:: maintenance(apiuser, repoid)
857
862
858 Triggers a maintenance on the given repository.
863 Triggers a maintenance on the given repository.
859
864
860 This command can only be run using an |authtoken| with admin
865 This command can only be run using an |authtoken| with admin
861 rights to the specified repository. For more information,
866 rights to the specified repository. For more information,
862 see :ref:`config-token-ref`.
867 see :ref:`config-token-ref`.
863
868
864 This command takes the following options:
869 This command takes the following options:
865
870
866 :param apiuser: This is filled automatically from the |authtoken|.
871 :param apiuser: This is filled automatically from the |authtoken|.
867 :type apiuser: AuthUser
872 :type apiuser: AuthUser
868 :param repoid: The repository name or repository ID.
873 :param repoid: The repository name or repository ID.
869 :type repoid: str or int
874 :type repoid: str or int
870
875
871 Example output:
876 Example output:
872
877
873 .. code-block:: bash
878 .. code-block:: bash
874
879
875 id : <id_given_in_input>
880 id : <id_given_in_input>
876 result : {
881 result : {
877 "msg": "executed maintenance command",
882 "msg": "executed maintenance command",
878 "executed_actions": [
883 "executed_actions": [
879 <action_message>, <action_message2>...
884 <action_message>, <action_message2>...
880 ],
885 ],
881 "repository": "<repository name>"
886 "repository": "<repository name>"
882 }
887 }
883 error : null
888 error : null
884
889
885 Example error output:
890 Example error output:
886
891
887 .. code-block:: bash
892 .. code-block:: bash
888
893
889 id : <id_given_in_input>
894 id : <id_given_in_input>
890 result : null
895 result : null
891 error : {
896 error : {
892 "Unable to execute maintenance on `<reponame>`"
897 "Unable to execute maintenance on `<reponame>`"
893 }
898 }
894
899
895
900
896 pull
901 pull
897 ----
902 ----
898
903
899 .. py:function:: pull(apiuser, repoid, remote_uri=<Optional:None>)
904 .. py:function:: pull(apiuser, repoid, remote_uri=<Optional:None>)
900
905
901 Triggers a pull on the given repository from a remote location. You
906 Triggers a pull on the given repository from a remote location. You
902 can use this to keep remote repositories up-to-date.
907 can use this to keep remote repositories up-to-date.
903
908
904 This command can only be run using an |authtoken| with admin
909 This command can only be run using an |authtoken| with admin
905 rights to the specified repository. For more information,
910 rights to the specified repository. For more information,
906 see :ref:`config-token-ref`.
911 see :ref:`config-token-ref`.
907
912
908 This command takes the following options:
913 This command takes the following options:
909
914
910 :param apiuser: This is filled automatically from the |authtoken|.
915 :param apiuser: This is filled automatically from the |authtoken|.
911 :type apiuser: AuthUser
916 :type apiuser: AuthUser
912 :param repoid: The repository name or repository ID.
917 :param repoid: The repository name or repository ID.
913 :type repoid: str or int
918 :type repoid: str or int
914 :param remote_uri: Optional remote URI to pass in for pull
919 :param remote_uri: Optional remote URI to pass in for pull
915 :type remote_uri: str
920 :type remote_uri: str
916
921
917 Example output:
922 Example output:
918
923
919 .. code-block:: bash
924 .. code-block:: bash
920
925
921 id : <id_given_in_input>
926 id : <id_given_in_input>
922 result : {
927 result : {
923 "msg": "Pulled from url `<remote_url>` on repo `<repository name>`"
928 "msg": "Pulled from url `<remote_url>` on repo `<repository name>`"
924 "repository": "<repository name>"
929 "repository": "<repository name>"
925 }
930 }
926 error : null
931 error : null
927
932
928 Example error output:
933 Example error output:
929
934
930 .. code-block:: bash
935 .. code-block:: bash
931
936
932 id : <id_given_in_input>
937 id : <id_given_in_input>
933 result : null
938 result : null
934 error : {
939 error : {
935 "Unable to push changes from `<remote_url>`"
940 "Unable to push changes from `<remote_url>`"
936 }
941 }
937
942
938
943
939 remove_field_from_repo
944 remove_field_from_repo
940 ----------------------
945 ----------------------
941
946
942 .. py:function:: remove_field_from_repo(apiuser, repoid, key)
947 .. py:function:: remove_field_from_repo(apiuser, repoid, key)
943
948
944 Removes an extra field from a repository.
949 Removes an extra field from a repository.
945
950
946 This command can only be run using an |authtoken| with at least
951 This command can only be run using an |authtoken| with at least
947 write permissions to the |repo|.
952 write permissions to the |repo|.
948
953
949 :param apiuser: This is filled automatically from the |authtoken|.
954 :param apiuser: This is filled automatically from the |authtoken|.
950 :type apiuser: AuthUser
955 :type apiuser: AuthUser
951 :param repoid: Set the repository name or repository ID.
956 :param repoid: Set the repository name or repository ID.
952 :type repoid: str or int
957 :type repoid: str or int
953 :param key: Set the unique field key for this repository.
958 :param key: Set the unique field key for this repository.
954 :type key: str
959 :type key: str
955
960
956
961
957 revoke_user_group_permission
962 revoke_user_group_permission
958 ----------------------------
963 ----------------------------
959
964
960 .. py:function:: revoke_user_group_permission(apiuser, repoid, usergroupid)
965 .. py:function:: revoke_user_group_permission(apiuser, repoid, usergroupid)
961
966
962 Revoke the permissions of a user group on a given repository.
967 Revoke the permissions of a user group on a given repository.
963
968
964 This command can only be run using an |authtoken| with admin
969 This command can only be run using an |authtoken| with admin
965 permissions on the |repo|.
970 permissions on the |repo|.
966
971
967 :param apiuser: This is filled automatically from the |authtoken|.
972 :param apiuser: This is filled automatically from the |authtoken|.
968 :type apiuser: AuthUser
973 :type apiuser: AuthUser
969 :param repoid: Set the repository name or repository ID.
974 :param repoid: Set the repository name or repository ID.
970 :type repoid: str or int
975 :type repoid: str or int
971 :param usergroupid: Specify the user group ID.
976 :param usergroupid: Specify the user group ID.
972 :type usergroupid: str or int
977 :type usergroupid: str or int
973
978
974 Example output:
979 Example output:
975
980
976 .. code-block:: bash
981 .. code-block:: bash
977
982
978 id : <id_given_in_input>
983 id : <id_given_in_input>
979 result: {
984 result: {
980 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
985 "msg" : "Revoked perm for group: `<usersgroupname>` in repo: `<reponame>`",
981 "success": true
986 "success": true
982 }
987 }
983 error: null
988 error: null
984
989
985
990
986 revoke_user_permission
991 revoke_user_permission
987 ----------------------
992 ----------------------
988
993
989 .. py:function:: revoke_user_permission(apiuser, repoid, userid)
994 .. py:function:: revoke_user_permission(apiuser, repoid, userid)
990
995
991 Revoke permission for a user on the specified repository.
996 Revoke permission for a user on the specified repository.
992
997
993 This command can only be run using an |authtoken| with admin
998 This command can only be run using an |authtoken| with admin
994 permissions on the |repo|.
999 permissions on the |repo|.
995
1000
996 :param apiuser: This is filled automatically from the |authtoken|.
1001 :param apiuser: This is filled automatically from the |authtoken|.
997 :type apiuser: AuthUser
1002 :type apiuser: AuthUser
998 :param repoid: Set the repository name or repository ID.
1003 :param repoid: Set the repository name or repository ID.
999 :type repoid: str or int
1004 :type repoid: str or int
1000 :param userid: Set the user name of revoked user.
1005 :param userid: Set the user name of revoked user.
1001 :type userid: str or int
1006 :type userid: str or int
1002
1007
1003 Example error output:
1008 Example error output:
1004
1009
1005 .. code-block:: bash
1010 .. code-block:: bash
1006
1011
1007 id : <id_given_in_input>
1012 id : <id_given_in_input>
1008 result: {
1013 result: {
1009 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
1014 "msg" : "Revoked perm for user: `<username>` in repo: `<reponame>`",
1010 "success": true
1015 "success": true
1011 }
1016 }
1012 error: null
1017 error: null
1013
1018
1014
1019
1015 set_repo_settings
1020 set_repo_settings
1016 -----------------
1021 -----------------
1017
1022
1018 .. py:function:: set_repo_settings(apiuser, repoid, settings)
1023 .. py:function:: set_repo_settings(apiuser, repoid, settings)
1019
1024
1020 Update repository settings. Returns true on success.
1025 Update repository settings. Returns true on success.
1021
1026
1022 :param apiuser: This is filled automatically from the |authtoken|.
1027 :param apiuser: This is filled automatically from the |authtoken|.
1023 :type apiuser: AuthUser
1028 :type apiuser: AuthUser
1024 :param repoid: The repository name or repository id.
1029 :param repoid: The repository name or repository id.
1025 :type repoid: str or int
1030 :type repoid: str or int
1026 :param settings: The new settings for the repository.
1031 :param settings: The new settings for the repository.
1027 :type: settings: dict
1032 :type: settings: dict
1028
1033
1029 Example output:
1034 Example output:
1030
1035
1031 .. code-block:: bash
1036 .. code-block:: bash
1032
1037
1033 {
1038 {
1034 "error": null,
1039 "error": null,
1035 "id": 237,
1040 "id": 237,
1036 "result": true
1041 "result": true
1037 }
1042 }
1038
1043
1039
1044
1040 strip
1045 strip
1041 -----
1046 -----
1042
1047
1043 .. py:function:: strip(apiuser, repoid, revision, branch)
1048 .. py:function:: strip(apiuser, repoid, revision, branch)
1044
1049
1045 Strips the given revision from the specified repository.
1050 Strips the given revision from the specified repository.
1046
1051
1047 * This will remove the revision and all of its decendants.
1052 * This will remove the revision and all of its decendants.
1048
1053
1049 This command can only be run using an |authtoken| with admin rights to
1054 This command can only be run using an |authtoken| with admin rights to
1050 the specified repository.
1055 the specified repository.
1051
1056
1052 This command takes the following options:
1057 This command takes the following options:
1053
1058
1054 :param apiuser: This is filled automatically from the |authtoken|.
1059 :param apiuser: This is filled automatically from the |authtoken|.
1055 :type apiuser: AuthUser
1060 :type apiuser: AuthUser
1056 :param repoid: The repository name or repository ID.
1061 :param repoid: The repository name or repository ID.
1057 :type repoid: str or int
1062 :type repoid: str or int
1058 :param revision: The revision you wish to strip.
1063 :param revision: The revision you wish to strip.
1059 :type revision: str
1064 :type revision: str
1060 :param branch: The branch from which to strip the revision.
1065 :param branch: The branch from which to strip the revision.
1061 :type branch: str
1066 :type branch: str
1062
1067
1063 Example output:
1068 Example output:
1064
1069
1065 .. code-block:: bash
1070 .. code-block:: bash
1066
1071
1067 id : <id_given_in_input>
1072 id : <id_given_in_input>
1068 result : {
1073 result : {
1069 "msg": "'Stripped commit <commit_hash> from repo `<repository name>`'"
1074 "msg": "'Stripped commit <commit_hash> from repo `<repository name>`'"
1070 "repository": "<repository name>"
1075 "repository": "<repository name>"
1071 }
1076 }
1072 error : null
1077 error : null
1073
1078
1074 Example error output:
1079 Example error output:
1075
1080
1076 .. code-block:: bash
1081 .. code-block:: bash
1077
1082
1078 id : <id_given_in_input>
1083 id : <id_given_in_input>
1079 result : null
1084 result : null
1080 error : {
1085 error : {
1081 "Unable to strip commit <commit_hash> from repo `<repository name>`"
1086 "Unable to strip commit <commit_hash> from repo `<repository name>`"
1082 }
1087 }
1083
1088
1084
1089
1085 update_repo
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 Updates a repository with the given information.
1095 Updates a repository with the given information.
1091
1096
1092 This command can only be run using an |authtoken| with at least
1097 This command can only be run using an |authtoken| with at least
1093 admin permissions to the |repo|.
1098 admin permissions to the |repo|.
1094
1099
1095 * If the repository name contains "/", repository will be updated
1100 * If the repository name contains "/", repository will be updated
1096 accordingly with a repository group or nested repository groups
1101 accordingly with a repository group or nested repository groups
1097
1102
1098 For example repoid=repo-test name="foo/bar/repo-test" will update |repo|
1103 For example repoid=repo-test name="foo/bar/repo-test" will update |repo|
1099 called "repo-test" and place it inside group "foo/bar".
1104 called "repo-test" and place it inside group "foo/bar".
1100 You have to have permissions to access and write to the last repository
1105 You have to have permissions to access and write to the last repository
1101 group ("bar" in this example)
1106 group ("bar" in this example)
1102
1107
1103 :param apiuser: This is filled automatically from the |authtoken|.
1108 :param apiuser: This is filled automatically from the |authtoken|.
1104 :type apiuser: AuthUser
1109 :type apiuser: AuthUser
1105 :param repoid: repository name or repository ID.
1110 :param repoid: repository name or repository ID.
1106 :type repoid: str or int
1111 :type repoid: str or int
1107 :param repo_name: Update the |repo| name, including the
1112 :param repo_name: Update the |repo| name, including the
1108 repository group it's in.
1113 repository group it's in.
1109 :type repo_name: str
1114 :type repo_name: str
1110 :param owner: Set the |repo| owner.
1115 :param owner: Set the |repo| owner.
1111 :type owner: str
1116 :type owner: str
1112 :param fork_of: Set the |repo| as fork of another |repo|.
1117 :param fork_of: Set the |repo| as fork of another |repo|.
1113 :type fork_of: str
1118 :type fork_of: str
1114 :param description: Update the |repo| description.
1119 :param description: Update the |repo| description.
1115 :type description: str
1120 :type description: str
1116 :param private: Set the |repo| as private. (True | False)
1121 :param private: Set the |repo| as private. (True | False)
1117 :type private: bool
1122 :type private: bool
1118 :param clone_uri: Update the |repo| clone URI.
1123 :param clone_uri: Update the |repo| clone URI.
1119 :type clone_uri: str
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 :type landing_rev: str
1126 :type landing_rev: str
1122 :param enable_statistics: Enable statistics on the |repo|, (True | False).
1127 :param enable_statistics: Enable statistics on the |repo|, (True | False).
1123 :type enable_statistics: bool
1128 :type enable_statistics: bool
1124 :param enable_locking: Enable |repo| locking.
1129 :param enable_locking: Enable |repo| locking.
1125 :type enable_locking: bool
1130 :type enable_locking: bool
1126 :param enable_downloads: Enable downloads from the |repo|, (True | False).
1131 :param enable_downloads: Enable downloads from the |repo|, (True | False).
1127 :type enable_downloads: bool
1132 :type enable_downloads: bool
1128 :param fields: Add extra fields to the |repo|. Use the following
1133 :param fields: Add extra fields to the |repo|. Use the following
1129 example format: ``field_key=field_val,field_key2=fieldval2``.
1134 example format: ``field_key=field_val,field_key2=fieldval2``.
1130 Escape ', ' with \,
1135 Escape ', ' with \,
1131 :type fields: str
1136 :type fields: str
1132
1137
1133
1138
@@ -1,35 +1,41 b''
1 .. _search-methods-ref:
1 .. _search-methods-ref:
2
2
3 search methods
3 search methods
4 ==============
4 ==============
5
5
6 search
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 Fetch Full Text Search results using API.
11 Fetch Full Text Search results using API.
12
12
13 :param apiuser: This is filled automatically from the |authtoken|.
13 :param apiuser: This is filled automatically from the |authtoken|.
14 :type apiuser: AuthUser
14 :type apiuser: AuthUser
15 :param search_query: Search query.
15 :param search_query: Search query.
16 :type search_query: str
16 :type search_query: str
17 :param search_type: Search type. The following are valid options:
17 :param search_type: Search type. The following are valid options:
18 * commit
18 * commit
19 * content
19 * content
20 * path
20 * path
21 :type search_type: str
21 :type search_type: str
22 :param page_limit: Page item limit, from 1 to 500. Default 10 items.
22 :param page_limit: Page item limit, from 1 to 500. Default 10 items.
23 :type page_limit: Optional(int)
23 :type page_limit: Optional(int)
24 :param page: Page number. Default first page.
24 :param page: Page number. Default first page.
25 :type page: Optional(int)
25 :type page: Optional(int)
26 :param search_sort: Search sort order. Default newfirst. The following are valid options:
26 :param search_sort: Search sort order.Must start with asc: or desc: Default desc:date.
27 * newfirst
27 The following are valid options:
28 * oldfirst
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 :type search_sort: Optional(str)
35 :type search_sort: Optional(str)
30 :param repo_name: Filter by one repo. Default is all.
36 :param repo_name: Filter by one repo. Default is all.
31 :type repo_name: Optional(str)
37 :type repo_name: Optional(str)
32 :param repo_group_name: Filter by one repo group. Default is all.
38 :param repo_group_name: Filter by one repo group. Default is all.
33 :type repo_group_name: Optional(str)
39 :type repo_group_name: Optional(str)
34
40
35
41
@@ -1,37 +1,184 b''
1 .. _store-methods-ref:
1 .. _store-methods-ref:
2
2
3 store methods
3 store methods
4 =============
4 =============
5
5
6 file_store_add (EE only)
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 Upload API for the file_store
11 Upload API for the file_store
12
12
13 Example usage from CLI::
13 Example usage from CLI::
14 rhodecode-api --instance-name=enterprise-1 upload_file "{"content": "$(cat image.jpg | base64)", "filename":"image.jpg"}"
14 rhodecode-api --instance-name=enterprise-1 upload_file "{"content": "$(cat image.jpg | base64)", "filename":"image.jpg"}"
15
15
16 This command takes the following options:
16 This command takes the following options:
17
17
18 :param apiuser: This is filled automatically from the |authtoken|.
18 :param apiuser: This is filled automatically from the |authtoken|.
19 :type apiuser: AuthUser
19 :type apiuser: AuthUser
20 :param filename: name of the file uploaded
20 :param filename: name of the file uploaded
21 :type filename: str
21 :type filename: str
22 :param description: Optional description for added file
23 :type description: str
22 :param content: base64 encoded content of the uploaded file
24 :param content: base64 encoded content of the uploaded file
23 :type content: str
25 :type content: str
24
26
25 Example output:
27 Example output:
26
28
27 .. code-block:: bash
29 .. code-block:: bash
28
30
29 id : <id_given_in_input>
31 id : <id_given_in_input>
30 result: {
32 result: {
31 "access_path": "/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
33 "access_path": "/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
32 "access_path_fqn": "http://server.domain.com/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
34 "access_path_fqn": "http://server.domain.com/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg",
33 "store_fid": "84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg"
35 "store_fid": "84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg"
34 }
36 }
35 error : null
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 .. _user-group-methods-ref:
1 .. _user-group-methods-ref:
2
2
3 user_group methods
3 user_group methods
4 ==================
4 ==================
5
5
6 add_user_to_user_group
6 add_user_to_user_group
7 ----------------------
7 ----------------------
8
8
9 .. py:function:: add_user_to_user_group(apiuser, usergroupid, userid)
9 .. py:function:: add_user_to_user_group(apiuser, usergroupid, userid)
10
10
11 Adds a user to a `user group`. If the user already exists in the group
11 Adds a user to a `user group`. If the user already exists in the group
12 this command will return false.
12 this command will return false.
13
13
14 This command can only be run using an |authtoken| with admin rights to
14 This command can only be run using an |authtoken| with admin rights to
15 the specified user group.
15 the specified user group.
16
16
17 This command takes the following options:
17 This command takes the following options:
18
18
19 :param apiuser: This is filled automatically from the |authtoken|.
19 :param apiuser: This is filled automatically from the |authtoken|.
20 :type apiuser: AuthUser
20 :type apiuser: AuthUser
21 :param usergroupid: Set the name of the `user group` to which a
21 :param usergroupid: Set the name of the `user group` to which a
22 user will be added.
22 user will be added.
23 :type usergroupid: int
23 :type usergroupid: int
24 :param userid: Set the `user_id` of the user to add to the group.
24 :param userid: Set the `user_id` of the user to add to the group.
25 :type userid: int
25 :type userid: int
26
26
27 Example output:
27 Example output:
28
28
29 .. code-block:: bash
29 .. code-block:: bash
30
30
31 id : <id_given_in_input>
31 id : <id_given_in_input>
32 result : {
32 result : {
33 "success": True|False # depends on if member is in group
33 "success": True|False # depends on if member is in group
34 "msg": "added member `<username>` to user group `<groupname>` |
34 "msg": "added member `<username>` to user group `<groupname>` |
35 User is already in that group"
35 User is already in that group"
36
36
37 }
37 }
38 error : null
38 error : null
39
39
40 Example error output:
40 Example error output:
41
41
42 .. code-block:: bash
42 .. code-block:: bash
43
43
44 id : <id_given_in_input>
44 id : <id_given_in_input>
45 result : null
45 result : null
46 error : {
46 error : {
47 "failed to add member to user group `<user_group_name>`"
47 "failed to add member to user group `<user_group_name>`"
48 }
48 }
49
49
50
50
51 create_user_group
51 create_user_group
52 -----------------
52 -----------------
53
53
54 .. py:function:: create_user_group(apiuser, group_name, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, active=<Optional:True>, sync=<Optional:None>)
54 .. py:function:: create_user_group(apiuser, group_name, description=<Optional:''>, owner=<Optional:<OptionalAttr:apiuser>>, active=<Optional:True>, sync=<Optional:None>)
55
55
56 Creates a new user group.
56 Creates a new user group.
57
57
58 This command can only be run using an |authtoken| with admin rights to
58 This command can only be run using an |authtoken| with admin rights to
59 the specified repository.
59 the specified repository.
60
60
61 This command takes the following options:
61 This command takes the following options:
62
62
63 :param apiuser: This is filled automatically from the |authtoken|.
63 :param apiuser: This is filled automatically from the |authtoken|.
64 :type apiuser: AuthUser
64 :type apiuser: AuthUser
65 :param group_name: Set the name of the new user group.
65 :param group_name: Set the name of the new user group.
66 :type group_name: str
66 :type group_name: str
67 :param description: Give a description of the new user group.
67 :param description: Give a description of the new user group.
68 :type description: str
68 :type description: str
69 :param owner: Set the owner of the new user group.
69 :param owner: Set the owner of the new user group.
70 If not set, the owner is the |authtoken| user.
70 If not set, the owner is the |authtoken| user.
71 :type owner: Optional(str or int)
71 :type owner: Optional(str or int)
72 :param active: Set this group as active.
72 :param active: Set this group as active.
73 :type active: Optional(``True`` | ``False``)
73 :type active: Optional(``True`` | ``False``)
74 :param sync: Set enabled or disabled the automatically sync from
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 :type sync: Optional(``True`` | ``False``)
78 :type sync: Optional(``True`` | ``False``)
77
79
78 Example output:
80 Example output:
79
81
80 .. code-block:: bash
82 .. code-block:: bash
81
83
82 id : <id_given_in_input>
84 id : <id_given_in_input>
83 result: {
85 result: {
84 "msg": "created new user group `<groupname>`",
86 "msg": "created new user group `<groupname>`",
85 "user_group": <user_group_object>
87 "user_group": <user_group_object>
86 }
88 }
87 error: null
89 error: null
88
90
89 Example error output:
91 Example error output:
90
92
91 .. code-block:: bash
93 .. code-block:: bash
92
94
93 id : <id_given_in_input>
95 id : <id_given_in_input>
94 result : null
96 result : null
95 error : {
97 error : {
96 "user group `<group name>` already exist"
98 "user group `<group name>` already exist"
97 or
99 or
98 "failed to create group `<group name>`"
100 "failed to create group `<group name>`"
99 }
101 }
100
102
101
103
102 delete_user_group
104 delete_user_group
103 -----------------
105 -----------------
104
106
105 .. py:function:: delete_user_group(apiuser, usergroupid)
107 .. py:function:: delete_user_group(apiuser, usergroupid)
106
108
107 Deletes the specified `user group`.
109 Deletes the specified `user group`.
108
110
109 This command can only be run using an |authtoken| with admin rights to
111 This command can only be run using an |authtoken| with admin rights to
110 the specified repository.
112 the specified repository.
111
113
112 This command takes the following options:
114 This command takes the following options:
113
115
114 :param apiuser: filled automatically from apikey
116 :param apiuser: filled automatically from apikey
115 :type apiuser: AuthUser
117 :type apiuser: AuthUser
116 :param usergroupid:
118 :param usergroupid:
117 :type usergroupid: int
119 :type usergroupid: int
118
120
119 Example output:
121 Example output:
120
122
121 .. code-block:: bash
123 .. code-block:: bash
122
124
123 id : <id_given_in_input>
125 id : <id_given_in_input>
124 result : {
126 result : {
125 "msg": "deleted user group ID:<user_group_id> <user_group_name>"
127 "msg": "deleted user group ID:<user_group_id> <user_group_name>"
126 }
128 }
127 error : null
129 error : null
128
130
129 Example error output:
131 Example error output:
130
132
131 .. code-block:: bash
133 .. code-block:: bash
132
134
133 id : <id_given_in_input>
135 id : <id_given_in_input>
134 result : null
136 result : null
135 error : {
137 error : {
136 "failed to delete user group ID:<user_group_id> <user_group_name>"
138 "failed to delete user group ID:<user_group_id> <user_group_name>"
137 or
139 or
138 "RepoGroup assigned to <repo_groups_list>"
140 "RepoGroup assigned to <repo_groups_list>"
139 }
141 }
140
142
141
143
142 get_user_group
144 get_user_group
143 --------------
145 --------------
144
146
145 .. py:function:: get_user_group(apiuser, usergroupid)
147 .. py:function:: get_user_group(apiuser, usergroupid)
146
148
147 Returns the data of an existing user group.
149 Returns the data of an existing user group.
148
150
149 This command can only be run using an |authtoken| with admin rights to
151 This command can only be run using an |authtoken| with admin rights to
150 the specified repository.
152 the specified repository.
151
153
152 :param apiuser: This is filled automatically from the |authtoken|.
154 :param apiuser: This is filled automatically from the |authtoken|.
153 :type apiuser: AuthUser
155 :type apiuser: AuthUser
154 :param usergroupid: Set the user group from which to return data.
156 :param usergroupid: Set the user group from which to return data.
155 :type usergroupid: str or int
157 :type usergroupid: str or int
156
158
157 Example error output:
159 Example error output:
158
160
159 .. code-block:: bash
161 .. code-block:: bash
160
162
161 {
163 {
162 "error": null,
164 "error": null,
163 "id": <id>,
165 "id": <id>,
164 "result": {
166 "result": {
165 "active": true,
167 "active": true,
166 "group_description": "group description",
168 "group_description": "group description",
167 "group_name": "group name",
169 "group_name": "group name",
168 "permissions": [
170 "permissions": [
169 {
171 {
170 "name": "owner-name",
172 "name": "owner-name",
171 "origin": "owner",
173 "origin": "owner",
172 "permission": "usergroup.admin",
174 "permission": "usergroup.admin",
173 "type": "user"
175 "type": "user"
174 },
176 },
175 {
177 {
176 {
178 {
177 "name": "user name",
179 "name": "user name",
178 "origin": "permission",
180 "origin": "permission",
179 "permission": "usergroup.admin",
181 "permission": "usergroup.admin",
180 "type": "user"
182 "type": "user"
181 },
183 },
182 {
184 {
183 "name": "user group name",
185 "name": "user group name",
184 "origin": "permission",
186 "origin": "permission",
185 "permission": "usergroup.write",
187 "permission": "usergroup.write",
186 "type": "user_group"
188 "type": "user_group"
187 }
189 }
188 ],
190 ],
189 "permissions_summary": {
191 "permissions_summary": {
190 "repositories": {
192 "repositories": {
191 "aa-root-level-repo-1": "repository.admin"
193 "aa-root-level-repo-1": "repository.admin"
192 },
194 },
193 "repositories_groups": {}
195 "repositories_groups": {}
194 },
196 },
195 "owner": "owner name",
197 "owner": "owner name",
196 "users": [],
198 "users": [],
197 "users_group_id": 2
199 "users_group_id": 2
198 }
200 }
199 }
201 }
200
202
201
203
202 get_user_groups
204 get_user_groups
203 ---------------
205 ---------------
204
206
205 .. py:function:: get_user_groups(apiuser)
207 .. py:function:: get_user_groups(apiuser)
206
208
207 Lists all the existing user groups within RhodeCode.
209 Lists all the existing user groups within RhodeCode.
208
210
209 This command can only be run using an |authtoken| with admin rights to
211 This command can only be run using an |authtoken| with admin rights to
210 the specified repository.
212 the specified repository.
211
213
212 This command takes the following options:
214 This command takes the following options:
213
215
214 :param apiuser: This is filled automatically from the |authtoken|.
216 :param apiuser: This is filled automatically from the |authtoken|.
215 :type apiuser: AuthUser
217 :type apiuser: AuthUser
216
218
217 Example error output:
219 Example error output:
218
220
219 .. code-block:: bash
221 .. code-block:: bash
220
222
221 id : <id_given_in_input>
223 id : <id_given_in_input>
222 result : [<user_group_obj>,...]
224 result : [<user_group_obj>,...]
223 error : null
225 error : null
224
226
225
227
226 grant_user_group_permission_to_user_group
228 grant_user_group_permission_to_user_group
227 -----------------------------------------
229 -----------------------------------------
228
230
229 .. py:function:: grant_user_group_permission_to_user_group(apiuser, usergroupid, sourceusergroupid, perm)
231 .. py:function:: grant_user_group_permission_to_user_group(apiuser, usergroupid, sourceusergroupid, perm)
230
232
231 Give one user group permissions to another user group.
233 Give one user group permissions to another user group.
232
234
233 :param apiuser: This is filled automatically from the |authtoken|.
235 :param apiuser: This is filled automatically from the |authtoken|.
234 :type apiuser: AuthUser
236 :type apiuser: AuthUser
235 :param usergroupid: Set the user group on which to edit permissions.
237 :param usergroupid: Set the user group on which to edit permissions.
236 :type usergroupid: str or int
238 :type usergroupid: str or int
237 :param sourceusergroupid: Set the source user group to which
239 :param sourceusergroupid: Set the source user group to which
238 access/permissions will be granted.
240 access/permissions will be granted.
239 :type sourceusergroupid: str or int
241 :type sourceusergroupid: str or int
240 :param perm: (usergroup.(none|read|write|admin))
242 :param perm: (usergroup.(none|read|write|admin))
241 :type perm: str
243 :type perm: str
242
244
243 Example output:
245 Example output:
244
246
245 .. code-block:: bash
247 .. code-block:: bash
246
248
247 id : <id_given_in_input>
249 id : <id_given_in_input>
248 result : {
250 result : {
249 "msg": "Granted perm: `<perm_name>` for user group: `<source_user_group_name>` in user group: `<user_group_name>`",
251 "msg": "Granted perm: `<perm_name>` for user group: `<source_user_group_name>` in user group: `<user_group_name>`",
250 "success": true
252 "success": true
251 }
253 }
252 error : null
254 error : null
253
255
254
256
255 grant_user_permission_to_user_group
257 grant_user_permission_to_user_group
256 -----------------------------------
258 -----------------------------------
257
259
258 .. py:function:: grant_user_permission_to_user_group(apiuser, usergroupid, userid, perm)
260 .. py:function:: grant_user_permission_to_user_group(apiuser, usergroupid, userid, perm)
259
261
260 Set permissions for a user in a user group.
262 Set permissions for a user in a user group.
261
263
262 :param apiuser: This is filled automatically from the |authtoken|.
264 :param apiuser: This is filled automatically from the |authtoken|.
263 :type apiuser: AuthUser
265 :type apiuser: AuthUser
264 :param usergroupid: Set the user group to edit permissions on.
266 :param usergroupid: Set the user group to edit permissions on.
265 :type usergroupid: str or int
267 :type usergroupid: str or int
266 :param userid: Set the user from whom you wish to set permissions.
268 :param userid: Set the user from whom you wish to set permissions.
267 :type userid: str
269 :type userid: str
268 :param perm: (usergroup.(none|read|write|admin))
270 :param perm: (usergroup.(none|read|write|admin))
269 :type perm: str
271 :type perm: str
270
272
271 Example output:
273 Example output:
272
274
273 .. code-block:: bash
275 .. code-block:: bash
274
276
275 id : <id_given_in_input>
277 id : <id_given_in_input>
276 result : {
278 result : {
277 "msg": "Granted perm: `<perm_name>` for user: `<username>` in user group: `<user_group_name>`",
279 "msg": "Granted perm: `<perm_name>` for user: `<username>` in user group: `<user_group_name>`",
278 "success": true
280 "success": true
279 }
281 }
280 error : null
282 error : null
281
283
282
284
283 remove_user_from_user_group
285 remove_user_from_user_group
284 ---------------------------
286 ---------------------------
285
287
286 .. py:function:: remove_user_from_user_group(apiuser, usergroupid, userid)
288 .. py:function:: remove_user_from_user_group(apiuser, usergroupid, userid)
287
289
288 Removes a user from a user group.
290 Removes a user from a user group.
289
291
290 * If the specified user is not in the group, this command will return
292 * If the specified user is not in the group, this command will return
291 `false`.
293 `false`.
292
294
293 This command can only be run using an |authtoken| with admin rights to
295 This command can only be run using an |authtoken| with admin rights to
294 the specified user group.
296 the specified user group.
295
297
296 :param apiuser: This is filled automatically from the |authtoken|.
298 :param apiuser: This is filled automatically from the |authtoken|.
297 :type apiuser: AuthUser
299 :type apiuser: AuthUser
298 :param usergroupid: Sets the user group name.
300 :param usergroupid: Sets the user group name.
299 :type usergroupid: str or int
301 :type usergroupid: str or int
300 :param userid: The user you wish to remove from |RCE|.
302 :param userid: The user you wish to remove from |RCE|.
301 :type userid: str or int
303 :type userid: str or int
302
304
303 Example output:
305 Example output:
304
306
305 .. code-block:: bash
307 .. code-block:: bash
306
308
307 id : <id_given_in_input>
309 id : <id_given_in_input>
308 result: {
310 result: {
309 "success": True|False, # depends on if member is in group
311 "success": True|False, # depends on if member is in group
310 "msg": "removed member <username> from user group <groupname> |
312 "msg": "removed member <username> from user group <groupname> |
311 User wasn't in group"
313 User wasn't in group"
312 }
314 }
313 error: null
315 error: null
314
316
315
317
316 revoke_user_group_permission_from_user_group
318 revoke_user_group_permission_from_user_group
317 --------------------------------------------
319 --------------------------------------------
318
320
319 .. py:function:: revoke_user_group_permission_from_user_group(apiuser, usergroupid, sourceusergroupid)
321 .. py:function:: revoke_user_group_permission_from_user_group(apiuser, usergroupid, sourceusergroupid)
320
322
321 Revoke the permissions that one user group has to another.
323 Revoke the permissions that one user group has to another.
322
324
323 :param apiuser: This is filled automatically from the |authtoken|.
325 :param apiuser: This is filled automatically from the |authtoken|.
324 :type apiuser: AuthUser
326 :type apiuser: AuthUser
325 :param usergroupid: Set the user group on which to edit permissions.
327 :param usergroupid: Set the user group on which to edit permissions.
326 :type usergroupid: str or int
328 :type usergroupid: str or int
327 :param sourceusergroupid: Set the user group from which permissions
329 :param sourceusergroupid: Set the user group from which permissions
328 are revoked.
330 are revoked.
329 :type sourceusergroupid: str or int
331 :type sourceusergroupid: str or int
330
332
331 Example output:
333 Example output:
332
334
333 .. code-block:: bash
335 .. code-block:: bash
334
336
335 id : <id_given_in_input>
337 id : <id_given_in_input>
336 result : {
338 result : {
337 "msg": "Revoked perm for user group: `<user_group_name>` in user group: `<target_user_group_name>`",
339 "msg": "Revoked perm for user group: `<user_group_name>` in user group: `<target_user_group_name>`",
338 "success": true
340 "success": true
339 }
341 }
340 error : null
342 error : null
341
343
342
344
343 revoke_user_permission_from_user_group
345 revoke_user_permission_from_user_group
344 --------------------------------------
346 --------------------------------------
345
347
346 .. py:function:: revoke_user_permission_from_user_group(apiuser, usergroupid, userid)
348 .. py:function:: revoke_user_permission_from_user_group(apiuser, usergroupid, userid)
347
349
348 Revoke a users permissions in a user group.
350 Revoke a users permissions in a user group.
349
351
350 :param apiuser: This is filled automatically from the |authtoken|.
352 :param apiuser: This is filled automatically from the |authtoken|.
351 :type apiuser: AuthUser
353 :type apiuser: AuthUser
352 :param usergroupid: Set the user group from which to revoke the user
354 :param usergroupid: Set the user group from which to revoke the user
353 permissions.
355 permissions.
354 :type: usergroupid: str or int
356 :type: usergroupid: str or int
355 :param userid: Set the userid of the user whose permissions will be
357 :param userid: Set the userid of the user whose permissions will be
356 revoked.
358 revoked.
357 :type userid: str
359 :type userid: str
358
360
359 Example output:
361 Example output:
360
362
361 .. code-block:: bash
363 .. code-block:: bash
362
364
363 id : <id_given_in_input>
365 id : <id_given_in_input>
364 result : {
366 result : {
365 "msg": "Revoked perm for user: `<username>` in user group: `<user_group_name>`",
367 "msg": "Revoked perm for user: `<username>` in user group: `<user_group_name>`",
366 "success": true
368 "success": true
367 }
369 }
368 error : null
370 error : null
369
371
370
372
371 update_user_group
373 update_user_group
372 -----------------
374 -----------------
373
375
374 .. py:function:: update_user_group(apiuser, usergroupid, group_name=<Optional:''>, description=<Optional:''>, owner=<Optional:None>, active=<Optional:True>, sync=<Optional:None>)
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 Updates the specified `user group` with the details provided.
378 Updates the specified `user group` with the details provided.
377
379
378 This command can only be run using an |authtoken| with admin rights to
380 This command can only be run using an |authtoken| with admin rights to
379 the specified repository.
381 the specified repository.
380
382
381 :param apiuser: This is filled automatically from the |authtoken|.
383 :param apiuser: This is filled automatically from the |authtoken|.
382 :type apiuser: AuthUser
384 :type apiuser: AuthUser
383 :param usergroupid: Set the id of the `user group` to update.
385 :param usergroupid: Set the id of the `user group` to update.
384 :type usergroupid: str or int
386 :type usergroupid: str or int
385 :param group_name: Set the new name the `user group`
387 :param group_name: Set the new name the `user group`
386 :type group_name: str
388 :type group_name: str
387 :param description: Give a description for the `user group`
389 :param description: Give a description for the `user group`
388 :type description: str
390 :type description: str
389 :param owner: Set the owner of the `user group`.
391 :param owner: Set the owner of the `user group`.
390 :type owner: Optional(str or int)
392 :type owner: Optional(str or int)
391 :param active: Set the group as active.
393 :param active: Set the group as active.
392 :type active: Optional(``True`` | ``False``)
394 :type active: Optional(``True`` | ``False``)
393 :param sync: Set enabled or disabled the automatically sync from
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 :type sync: Optional(``True`` | ``False``)
399 :type sync: Optional(``True`` | ``False``)
396
400
397 Example output:
401 Example output:
398
402
399 .. code-block:: bash
403 .. code-block:: bash
400
404
401 id : <id_given_in_input>
405 id : <id_given_in_input>
402 result : {
406 result : {
403 "msg": 'updated user group ID:<user group id> <user group name>',
407 "msg": 'updated user group ID:<user group id> <user group name>',
404 "user_group": <user_group_object>
408 "user_group": <user_group_object>
405 }
409 }
406 error : null
410 error : null
407
411
408 Example error output:
412 Example error output:
409
413
410 .. code-block:: bash
414 .. code-block:: bash
411
415
412 id : <id_given_in_input>
416 id : <id_given_in_input>
413 result : null
417 result : null
414 error : {
418 error : {
415 "failed to update user group `<user group name>`"
419 "failed to update user group `<user group name>`"
416 }
420 }
417
421
418
422
@@ -1,326 +1,331 b''
1 .. _user-methods-ref:
1 .. _user-methods-ref:
2
2
3 user methods
3 user methods
4 ============
4 ============
5
5
6 create_user
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 Creates a new user and returns the new user object.
11 Creates a new user and returns the new user object.
12
12
13 This command can only be run using an |authtoken| with admin rights to
13 This command can only be run using an |authtoken| with admin rights to
14 the specified repository.
14 the specified repository.
15
15
16 This command takes the following options:
16 This command takes the following options:
17
17
18 :param apiuser: This is filled automatically from the |authtoken|.
18 :param apiuser: This is filled automatically from the |authtoken|.
19 :type apiuser: AuthUser
19 :type apiuser: AuthUser
20 :param username: Set the new username.
20 :param username: Set the new username.
21 :type username: str or int
21 :type username: str or int
22 :param email: Set the user email address.
22 :param email: Set the user email address.
23 :type email: str
23 :type email: str
24 :param password: Set the new user password.
24 :param password: Set the new user password.
25 :type password: Optional(str)
25 :type password: Optional(str)
26 :param firstname: Set the new user firstname.
26 :param firstname: Set the new user firstname.
27 :type firstname: Optional(str)
27 :type firstname: Optional(str)
28 :param lastname: Set the new user surname.
28 :param lastname: Set the new user surname.
29 :type lastname: Optional(str)
29 :type lastname: Optional(str)
30 :param description: Set user description, or short bio. Metatags are allowed.
31 :type description: Optional(str)
30 :param active: Set the user as active.
32 :param active: Set the user as active.
31 :type active: Optional(``True`` | ``False``)
33 :type active: Optional(``True`` | ``False``)
32 :param admin: Give the new user admin rights.
34 :param admin: Give the new user admin rights.
33 :type admin: Optional(``True`` | ``False``)
35 :type admin: Optional(``True`` | ``False``)
34 :param extern_name: Set the authentication plugin name.
36 :param extern_name: Set the authentication plugin name.
35 Using LDAP this is filled with LDAP UID.
37 Using LDAP this is filled with LDAP UID.
36 :type extern_name: Optional(str)
38 :type extern_name: Optional(str)
37 :param extern_type: Set the new user authentication plugin.
39 :param extern_type: Set the new user authentication plugin.
38 :type extern_type: Optional(str)
40 :type extern_type: Optional(str)
39 :param force_password_change: Force the new user to change password
41 :param force_password_change: Force the new user to change password
40 on next login.
42 on next login.
41 :type force_password_change: Optional(``True`` | ``False``)
43 :type force_password_change: Optional(``True`` | ``False``)
42 :param create_personal_repo_group: Create personal repo group for this user
44 :param create_personal_repo_group: Create personal repo group for this user
43 :type create_personal_repo_group: Optional(``True`` | ``False``)
45 :type create_personal_repo_group: Optional(``True`` | ``False``)
44
46
45 Example output:
47 Example output:
46
48
47 .. code-block:: bash
49 .. code-block:: bash
48
50
49 id : <id_given_in_input>
51 id : <id_given_in_input>
50 result: {
52 result: {
51 "msg" : "created new user `<username>`",
53 "msg" : "created new user `<username>`",
52 "user": <user_obj>
54 "user": <user_obj>
53 }
55 }
54 error: null
56 error: null
55
57
56 Example error output:
58 Example error output:
57
59
58 .. code-block:: bash
60 .. code-block:: bash
59
61
60 id : <id_given_in_input>
62 id : <id_given_in_input>
61 result : null
63 result : null
62 error : {
64 error : {
63 "user `<username>` already exist"
65 "user `<username>` already exist"
64 or
66 or
65 "email `<email>` already exist"
67 "email `<email>` already exist"
66 or
68 or
67 "failed to create user `<username>`"
69 "failed to create user `<username>`"
68 }
70 }
69
71
70
72
71 delete_user
73 delete_user
72 -----------
74 -----------
73
75
74 .. py:function:: delete_user(apiuser, userid)
76 .. py:function:: delete_user(apiuser, userid)
75
77
76 Deletes the specified user from the |RCE| user database.
78 Deletes the specified user from the |RCE| user database.
77
79
78 This command can only be run using an |authtoken| with admin rights to
80 This command can only be run using an |authtoken| with admin rights to
79 the specified repository.
81 the specified repository.
80
82
81 .. important::
83 .. important::
82
84
83 Ensure all open pull requests and open code review
85 Ensure all open pull requests and open code review
84 requests to this user are close.
86 requests to this user are close.
85
87
86 Also ensure all repositories, or repository groups owned by this
88 Also ensure all repositories, or repository groups owned by this
87 user are reassigned before deletion.
89 user are reassigned before deletion.
88
90
89 This command takes the following options:
91 This command takes the following options:
90
92
91 :param apiuser: This is filled automatically from the |authtoken|.
93 :param apiuser: This is filled automatically from the |authtoken|.
92 :type apiuser: AuthUser
94 :type apiuser: AuthUser
93 :param userid: Set the user to delete.
95 :param userid: Set the user to delete.
94 :type userid: str or int
96 :type userid: str or int
95
97
96 Example output:
98 Example output:
97
99
98 .. code-block:: bash
100 .. code-block:: bash
99
101
100 id : <id_given_in_input>
102 id : <id_given_in_input>
101 result: {
103 result: {
102 "msg" : "deleted user ID:<userid> <username>",
104 "msg" : "deleted user ID:<userid> <username>",
103 "user": null
105 "user": null
104 }
106 }
105 error: null
107 error: null
106
108
107 Example error output:
109 Example error output:
108
110
109 .. code-block:: bash
111 .. code-block:: bash
110
112
111 id : <id_given_in_input>
113 id : <id_given_in_input>
112 result : null
114 result : null
113 error : {
115 error : {
114 "failed to delete user ID:<userid> <username>"
116 "failed to delete user ID:<userid> <username>"
115 }
117 }
116
118
117
119
118 get_user
120 get_user
119 --------
121 --------
120
122
121 .. py:function:: get_user(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
123 .. py:function:: get_user(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
122
124
123 Returns the information associated with a username or userid.
125 Returns the information associated with a username or userid.
124
126
125 * If the ``userid`` is not set, this command returns the information
127 * If the ``userid`` is not set, this command returns the information
126 for the ``userid`` calling the method.
128 for the ``userid`` calling the method.
127
129
128 .. note::
130 .. note::
129
131
130 Normal users may only run this command against their ``userid``. For
132 Normal users may only run this command against their ``userid``. For
131 full privileges you must run this command using an |authtoken| with
133 full privileges you must run this command using an |authtoken| with
132 admin rights.
134 admin rights.
133
135
134 :param apiuser: This is filled automatically from the |authtoken|.
136 :param apiuser: This is filled automatically from the |authtoken|.
135 :type apiuser: AuthUser
137 :type apiuser: AuthUser
136 :param userid: Sets the userid for which data will be returned.
138 :param userid: Sets the userid for which data will be returned.
137 :type userid: Optional(str or int)
139 :type userid: Optional(str or int)
138
140
139 Example output:
141 Example output:
140
142
141 .. code-block:: bash
143 .. code-block:: bash
142
144
143 {
145 {
144 "error": null,
146 "error": null,
145 "id": <id>,
147 "id": <id>,
146 "result": {
148 "result": {
147 "active": true,
149 "active": true,
148 "admin": false,
150 "admin": false,
149 "api_keys": [ list of keys ],
151 "api_keys": [ list of keys ],
150 "auth_tokens": [ list of tokens with details ],
152 "auth_tokens": [ list of tokens with details ],
151 "email": "user@example.com",
153 "email": "user@example.com",
152 "emails": [
154 "emails": [
153 "user@example.com"
155 "user@example.com"
154 ],
156 ],
155 "extern_name": "rhodecode",
157 "extern_name": "rhodecode",
156 "extern_type": "rhodecode",
158 "extern_type": "rhodecode",
157 "firstname": "username",
159 "firstname": "username",
160 "description": "user description",
158 "ip_addresses": [],
161 "ip_addresses": [],
159 "language": null,
162 "language": null,
160 "last_login": "Timestamp",
163 "last_login": "Timestamp",
161 "last_activity": "Timestamp",
164 "last_activity": "Timestamp",
162 "lastname": "surnae",
165 "lastname": "surnae",
163 "permissions": <deprecated>,
166 "permissions": <deprecated>,
164 "permissions_summary": {
167 "permissions_summary": {
165 "global": [
168 "global": [
166 "hg.inherit_default_perms.true",
169 "hg.inherit_default_perms.true",
167 "usergroup.read",
170 "usergroup.read",
168 "hg.repogroup.create.false",
171 "hg.repogroup.create.false",
169 "hg.create.none",
172 "hg.create.none",
170 "hg.password_reset.enabled",
173 "hg.password_reset.enabled",
171 "hg.extern_activate.manual",
174 "hg.extern_activate.manual",
172 "hg.create.write_on_repogroup.false",
175 "hg.create.write_on_repogroup.false",
173 "hg.usergroup.create.false",
176 "hg.usergroup.create.false",
174 "group.none",
177 "group.none",
175 "repository.none",
178 "repository.none",
176 "hg.register.none",
179 "hg.register.none",
177 "hg.fork.repository"
180 "hg.fork.repository"
178 ],
181 ],
179 "repositories": { "username/example": "repository.write"},
182 "repositories": { "username/example": "repository.write"},
180 "repositories_groups": { "user-group/repo": "group.none" },
183 "repositories_groups": { "user-group/repo": "group.none" },
181 "user_groups": { "user_group_name": "usergroup.read" }
184 "user_groups": { "user_group_name": "usergroup.read" }
182 }
185 }
183 "user_id": 32,
186 "user_id": 32,
184 "username": "username"
187 "username": "username"
185 }
188 }
186 }
189 }
187
190
188
191
189 get_user_audit_logs
192 get_user_audit_logs
190 -------------------
193 -------------------
191
194
192 .. py:function:: get_user_audit_logs(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
195 .. py:function:: get_user_audit_logs(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
193
196
194 Fetches all action logs made by the specified user.
197 Fetches all action logs made by the specified user.
195
198
196 This command takes the following options:
199 This command takes the following options:
197
200
198 :param apiuser: This is filled automatically from the |authtoken|.
201 :param apiuser: This is filled automatically from the |authtoken|.
199 :type apiuser: AuthUser
202 :type apiuser: AuthUser
200 :param userid: Sets the userid whose list of locked |repos| will be
203 :param userid: Sets the userid whose list of locked |repos| will be
201 displayed.
204 displayed.
202 :type userid: Optional(str or int)
205 :type userid: Optional(str or int)
203
206
204 Example output:
207 Example output:
205
208
206 .. code-block:: bash
209 .. code-block:: bash
207
210
208 id : <id_given_in_input>
211 id : <id_given_in_input>
209 result : {
212 result : {
210 [action, action,...]
213 [action, action,...]
211 }
214 }
212 error : null
215 error : null
213
216
214
217
215 get_user_locks
218 get_user_locks
216 --------------
219 --------------
217
220
218 .. py:function:: get_user_locks(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
221 .. py:function:: get_user_locks(apiuser, userid=<Optional:<OptionalAttr:apiuser>>)
219
222
220 Displays all repositories locked by the specified user.
223 Displays all repositories locked by the specified user.
221
224
222 * If this command is run by a non-admin user, it returns
225 * If this command is run by a non-admin user, it returns
223 a list of |repos| locked by that user.
226 a list of |repos| locked by that user.
224
227
225 This command takes the following options:
228 This command takes the following options:
226
229
227 :param apiuser: This is filled automatically from the |authtoken|.
230 :param apiuser: This is filled automatically from the |authtoken|.
228 :type apiuser: AuthUser
231 :type apiuser: AuthUser
229 :param userid: Sets the userid whose list of locked |repos| will be
232 :param userid: Sets the userid whose list of locked |repos| will be
230 displayed.
233 displayed.
231 :type userid: Optional(str or int)
234 :type userid: Optional(str or int)
232
235
233 Example output:
236 Example output:
234
237
235 .. code-block:: bash
238 .. code-block:: bash
236
239
237 id : <id_given_in_input>
240 id : <id_given_in_input>
238 result : {
241 result : {
239 [repo_object, repo_object,...]
242 [repo_object, repo_object,...]
240 }
243 }
241 error : null
244 error : null
242
245
243
246
244 get_users
247 get_users
245 ---------
248 ---------
246
249
247 .. py:function:: get_users(apiuser)
250 .. py:function:: get_users(apiuser)
248
251
249 Lists all users in the |RCE| user database.
252 Lists all users in the |RCE| user database.
250
253
251 This command can only be run using an |authtoken| with admin rights to
254 This command can only be run using an |authtoken| with admin rights to
252 the specified repository.
255 the specified repository.
253
256
254 This command takes the following options:
257 This command takes the following options:
255
258
256 :param apiuser: This is filled automatically from the |authtoken|.
259 :param apiuser: This is filled automatically from the |authtoken|.
257 :type apiuser: AuthUser
260 :type apiuser: AuthUser
258
261
259 Example output:
262 Example output:
260
263
261 .. code-block:: bash
264 .. code-block:: bash
262
265
263 id : <id_given_in_input>
266 id : <id_given_in_input>
264 result: [<user_object>, ...]
267 result: [<user_object>, ...]
265 error: null
268 error: null
266
269
267
270
268 update_user
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 Updates the details for the specified user, if that user exists.
276 Updates the details for the specified user, if that user exists.
274
277
275 This command can only be run using an |authtoken| with admin rights to
278 This command can only be run using an |authtoken| with admin rights to
276 the specified repository.
279 the specified repository.
277
280
278 This command takes the following options:
281 This command takes the following options:
279
282
280 :param apiuser: This is filled automatically from |authtoken|.
283 :param apiuser: This is filled automatically from |authtoken|.
281 :type apiuser: AuthUser
284 :type apiuser: AuthUser
282 :param userid: Set the ``userid`` to update.
285 :param userid: Set the ``userid`` to update.
283 :type userid: str or int
286 :type userid: str or int
284 :param username: Set the new username.
287 :param username: Set the new username.
285 :type username: str or int
288 :type username: str or int
286 :param email: Set the new email.
289 :param email: Set the new email.
287 :type email: str
290 :type email: str
288 :param password: Set the new password.
291 :param password: Set the new password.
289 :type password: Optional(str)
292 :type password: Optional(str)
290 :param firstname: Set the new first name.
293 :param firstname: Set the new first name.
291 :type firstname: Optional(str)
294 :type firstname: Optional(str)
292 :param lastname: Set the new surname.
295 :param lastname: Set the new surname.
293 :type lastname: Optional(str)
296 :type lastname: Optional(str)
297 :param description: Set user description, or short bio. Metatags are allowed.
298 :type description: Optional(str)
294 :param active: Set the new user as active.
299 :param active: Set the new user as active.
295 :type active: Optional(``True`` | ``False``)
300 :type active: Optional(``True`` | ``False``)
296 :param admin: Give the user admin rights.
301 :param admin: Give the user admin rights.
297 :type admin: Optional(``True`` | ``False``)
302 :type admin: Optional(``True`` | ``False``)
298 :param extern_name: Set the authentication plugin user name.
303 :param extern_name: Set the authentication plugin user name.
299 Using LDAP this is filled with LDAP UID.
304 Using LDAP this is filled with LDAP UID.
300 :type extern_name: Optional(str)
305 :type extern_name: Optional(str)
301 :param extern_type: Set the authentication plugin type.
306 :param extern_type: Set the authentication plugin type.
302 :type extern_type: Optional(str)
307 :type extern_type: Optional(str)
303
308
304
309
305 Example output:
310 Example output:
306
311
307 .. code-block:: bash
312 .. code-block:: bash
308
313
309 id : <id_given_in_input>
314 id : <id_given_in_input>
310 result: {
315 result: {
311 "msg" : "updated user ID:<userid> <username>",
316 "msg" : "updated user ID:<userid> <username>",
312 "user": <user_object>,
317 "user": <user_object>,
313 }
318 }
314 error: null
319 error: null
315
320
316 Example error output:
321 Example error output:
317
322
318 .. code-block:: bash
323 .. code-block:: bash
319
324
320 id : <id_given_in_input>
325 id : <id_given_in_input>
321 result : null
326 result : null
322 error : {
327 error : {
323 "failed to update user `<username>`"
328 "failed to update user `<username>`"
324 }
329 }
325
330
326
331
@@ -1,243 +1,243 b''
1 .. _dev-setup:
1 .. _dev-setup:
2
2
3 ===================
3 ===================
4 Development setup
4 Development setup
5 ===================
5 ===================
6
6
7
7
8 RhodeCode Enterprise runs inside a Nix managed environment. This ensures build
8 RhodeCode Enterprise runs inside a Nix managed environment. This ensures build
9 environment dependencies are correctly declared and installed during setup.
9 environment dependencies are correctly declared and installed during setup.
10 It also enables atomic upgrades, rollbacks, and multiple instances of RhodeCode
10 It also enables atomic upgrades, rollbacks, and multiple instances of RhodeCode
11 Enterprise running with isolation.
11 Enterprise running with isolation.
12
12
13 To set up RhodeCode Enterprise inside the Nix environment, use the following steps:
13 To set up RhodeCode Enterprise inside the Nix environment, use the following steps:
14
14
15
15
16
16
17 Setup Nix Package Manager
17 Setup Nix Package Manager
18 -------------------------
18 -------------------------
19
19
20 To install the Nix Package Manager, please run::
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 or go to https://nixos.org/nix/ and follow the installation instructions.
24 or go to https://nixos.org/nix/ and follow the installation instructions.
25 Once this is correctly set up on your system, you should be able to use the
25 Once this is correctly set up on your system, you should be able to use the
26 following commands:
26 following commands:
27
27
28 * `nix-env`
28 * `nix-env`
29
29
30 * `nix-shell`
30 * `nix-shell`
31
31
32
32
33 .. tip::
33 .. tip::
34
34
35 Update your channels frequently by running ``nix-channel --update``.
35 Update your channels frequently by running ``nix-channel --update``.
36
36
37 .. note::
37 .. note::
38
38
39 To uninstall nix run the following:
39 To uninstall nix run the following:
40
40
41 remove the . "$HOME/.nix-profile/etc/profile.d/nix.sh" line in your ~/.profile or ~/.bash_profile
41 remove the . "$HOME/.nix-profile/etc/profile.d/nix.sh" line in your ~/.profile or ~/.bash_profile
42 rm -rf $HOME/{.nix-channels,.nix-defexpr,.nix-profile,.config/nixpkgs}
42 rm -rf $HOME/{.nix-channels,.nix-defexpr,.nix-profile,.config/nixpkgs}
43 sudo rm -rf /nix
43 sudo rm -rf /nix
44
44
45 Switch nix to the latest STABLE channel
45 Switch nix to the latest STABLE channel
46 ---------------------------------------
46 ---------------------------------------
47
47
48 run::
48 run::
49
49
50 nix-channel --add https://nixos.org/channels/nixos-18.03 nixpkgs
50 nix-channel --add https://nixos.org/channels/nixos-18.03 nixpkgs
51
51
52 Followed by::
52 Followed by::
53
53
54 nix-channel --update
54 nix-channel --update
55 nix-env -i nix-2.0.4
55 nix-env -i nix-2.0.4
56
56
57
57
58 Install required binaries
58 Install required binaries
59 -------------------------
59 -------------------------
60
60
61 We need some handy tools first.
61 We need some handy tools first.
62
62
63 run::
63 run::
64
64
65 nix-env -i nix-prefetch-hg
65 nix-env -i nix-prefetch-hg
66 nix-env -i nix-prefetch-git
66 nix-env -i nix-prefetch-git
67
67
68
68
69 Speed up JS build by installing PhantomJS
69 Speed up JS build by installing PhantomJS
70 -----------------------------------------
70 -----------------------------------------
71
71
72 PhantomJS will be downloaded each time nix-shell is invoked. To speed this by
72 PhantomJS will be downloaded each time nix-shell is invoked. To speed this by
73 setting already downloaded version do this::
73 setting already downloaded version do this::
74
74
75 nix-env -i phantomjs-2.1.1
75 nix-env -i phantomjs-2.1.1
76
76
77 # and set nix bin path
77 # and set nix bin path
78 export PATH=$PATH:~/.nix-profile/bin
78 export PATH=$PATH:~/.nix-profile/bin
79
79
80
80
81 Clone the required repositories
81 Clone the required repositories
82 -------------------------------
82 -------------------------------
83
83
84 After Nix is set up, clone the RhodeCode Enterprise Community Edition and
84 After Nix is set up, clone the RhodeCode Enterprise Community Edition and
85 RhodeCode VCSServer repositories into the same directory.
85 RhodeCode VCSServer repositories into the same directory.
86 RhodeCode currently is using Mercurial Version Control System, please make sure
86 RhodeCode currently is using Mercurial Version Control System, please make sure
87 you have it installed before continuing.
87 you have it installed before continuing.
88
88
89 To obtain the required sources, use the following commands::
89 To obtain the required sources, use the following commands::
90
90
91 mkdir rhodecode-develop && cd rhodecode-develop
91 mkdir rhodecode-develop && cd rhodecode-develop
92 hg clone -u default https://code.rhodecode.com/rhodecode-enterprise-ce
92 hg clone -u default https://code.rhodecode.com/rhodecode-enterprise-ce
93 hg clone -u default https://code.rhodecode.com/rhodecode-vcsserver
93 hg clone -u default https://code.rhodecode.com/rhodecode-vcsserver
94
94
95 .. note::
95 .. note::
96
96
97 If you cannot clone the repository, please contact us via support@rhodecode.com
97 If you cannot clone the repository, please contact us via support@rhodecode.com
98
98
99
99
100 Install some required libraries
100 Install some required libraries
101 -------------------------------
101 -------------------------------
102
102
103 There are some required drivers and dev libraries that we need to install to
103 There are some required drivers and dev libraries that we need to install to
104 test RhodeCode under different types of databases. For example in Ubuntu we
104 test RhodeCode under different types of databases. For example in Ubuntu we
105 need to install the following.
105 need to install the following.
106
106
107 required libraries::
107 required libraries::
108
108
109 # svn related
109 # svn related
110 sudo apt-get install libapr1-dev libaprutil1-dev
110 sudo apt-get install libapr1-dev libaprutil1-dev
111 sudo apt-get install libsvn-dev
111 sudo apt-get install libsvn-dev
112 # libcurl required too
112 # libcurl required too
113 sudo apt-get install libcurl4-openssl-dev
113 sudo apt-get install libcurl4-openssl-dev
114 # mysql/pg server for development, optional
114 # mysql/pg server for development, optional
115 sudo apt-get install mysql-server libmysqlclient-dev
115 sudo apt-get install mysql-server libmysqlclient-dev
116 sudo apt-get install postgresql postgresql-contrib libpq-dev
116 sudo apt-get install postgresql postgresql-contrib libpq-dev
117
117
118
118
119
119
120 Enter the Development Shell
120 Enter the Development Shell
121 ---------------------------
121 ---------------------------
122
122
123 The final step is to start the development shells. To do this, run the
123 The final step is to start the development shells. To do this, run the
124 following command from inside the cloned repository::
124 following command from inside the cloned repository::
125
125
126 # first, the vcsserver
126 # first, the vcsserver
127 cd ~/rhodecode-vcsserver
127 cd ~/rhodecode-vcsserver
128 nix-shell
128 nix-shell
129
129
130 # then enterprise sources
130 # then enterprise sources
131 cd ~/rhodecode-enterprise-ce
131 cd ~/rhodecode-enterprise-ce
132 nix-shell
132 nix-shell
133
133
134 .. note::
134 .. note::
135
135
136 On the first run, this will take a while to download and optionally compile
136 On the first run, this will take a while to download and optionally compile
137 a few things. The following runs will be faster. The development shell works
137 a few things. The following runs will be faster. The development shell works
138 fine on both MacOS and Linux platforms.
138 fine on both MacOS and Linux platforms.
139
139
140
140
141 Create config.nix for development
141 Create config.nix for development
142 ---------------------------------
142 ---------------------------------
143
143
144 In order to run proper tests and setup linking across projects, a config.nix
144 In order to run proper tests and setup linking across projects, a config.nix
145 file needs to be setup::
145 file needs to be setup::
146
146
147 # create config
147 # create config
148 mkdir -p ~/.nixpkgs
148 mkdir -p ~/.nixpkgs
149 touch ~/.nixpkgs/config.nix
149 touch ~/.nixpkgs/config.nix
150
150
151 # put the below content into the ~/.nixpkgs/config.nix file
151 # put the below content into the ~/.nixpkgs/config.nix file
152 # adjusts, the path to where you cloned your repositories.
152 # adjusts, the path to where you cloned your repositories.
153
153
154 {
154 {
155 rc = {
155 rc = {
156 sources = {
156 sources = {
157 rhodecode-vcsserver = "/home/dev/rhodecode-vcsserver";
157 rhodecode-vcsserver = "/home/dev/rhodecode-vcsserver";
158 rhodecode-enterprise-ce = "/home/dev/rhodecode-enterprise-ce";
158 rhodecode-enterprise-ce = "/home/dev/rhodecode-enterprise-ce";
159 rhodecode-enterprise-ee = "/home/dev/rhodecode-enterprise-ee";
159 rhodecode-enterprise-ee = "/home/dev/rhodecode-enterprise-ee";
160 };
160 };
161 };
161 };
162 }
162 }
163
163
164
164
165
165
166 Creating a Development Configuration
166 Creating a Development Configuration
167 ------------------------------------
167 ------------------------------------
168
168
169 To create a development environment for RhodeCode Enterprise,
169 To create a development environment for RhodeCode Enterprise,
170 use the following steps:
170 use the following steps:
171
171
172 1. Create a copy of vcsserver config:
172 1. Create a copy of vcsserver config:
173 `cp ~/rhodecode-vcsserver/configs/development.ini ~/rhodecode-vcsserver/configs/dev.ini`
173 `cp ~/rhodecode-vcsserver/configs/development.ini ~/rhodecode-vcsserver/configs/dev.ini`
174 2. Create a copy of rhodocode config:
174 2. Create a copy of rhodocode config:
175 `cp ~/rhodecode-enterprise-ce/configs/development.ini ~/rhodecode-enterprise-ce/configs/dev.ini`
175 `cp ~/rhodecode-enterprise-ce/configs/development.ini ~/rhodecode-enterprise-ce/configs/dev.ini`
176 3. Adjust the configuration settings to your needs if needed.
176 3. Adjust the configuration settings to your needs if needed.
177
177
178 .. note::
178 .. note::
179
179
180 It is recommended to use the name `dev.ini` since it's included in .hgignore file.
180 It is recommended to use the name `dev.ini` since it's included in .hgignore file.
181
181
182
182
183 Setup the Development Database
183 Setup the Development Database
184 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
184 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
185
185
186 To create a development database, use the following example. This is a one
186 To create a development database, use the following example. This is a one
187 time operation executed from the nix-shell of rhodecode-enterprise-ce sources ::
187 time operation executed from the nix-shell of rhodecode-enterprise-ce sources ::
188
188
189 rc-setup-app dev.ini \
189 rc-setup-app dev.ini \
190 --user=admin --password=secret \
190 --user=admin --password=secret \
191 --email=admin@example.com \
191 --email=admin@example.com \
192 --repos=~/my_dev_repos
192 --repos=~/my_dev_repos
193
193
194
194
195 Compile CSS and JavaScript
195 Compile CSS and JavaScript
196 ^^^^^^^^^^^^^^^^^^^^^^^^^^
196 ^^^^^^^^^^^^^^^^^^^^^^^^^^
197
197
198 To use the application's frontend and prepare it for production deployment,
198 To use the application's frontend and prepare it for production deployment,
199 you will need to compile the CSS and JavaScript with Grunt.
199 you will need to compile the CSS and JavaScript with Grunt.
200 This is easily done from within the nix-shell using the following command::
200 This is easily done from within the nix-shell using the following command::
201
201
202 make web-build
202 make web-build
203
203
204 When developing new features you will need to recompile following any
204 When developing new features you will need to recompile following any
205 changes made to the CSS or JavaScript files when developing the code::
205 changes made to the CSS or JavaScript files when developing the code::
206
206
207 grunt watch
207 grunt watch
208
208
209 This prepares the development (with comments/whitespace) versions of files.
209 This prepares the development (with comments/whitespace) versions of files.
210
210
211 Start the Development Servers
211 Start the Development Servers
212 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
212 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
213
213
214 From the rhodecode-vcsserver directory, start the development server in another
214 From the rhodecode-vcsserver directory, start the development server in another
215 nix-shell, using the following command::
215 nix-shell, using the following command::
216
216
217 pserve configs/dev.ini
217 pserve configs/dev.ini
218
218
219 In the adjacent nix-shell which you created for your development server, you may
219 In the adjacent nix-shell which you created for your development server, you may
220 now start CE with the following command::
220 now start CE with the following command::
221
221
222
222
223 pserve --reload configs/dev.ini
223 pserve --reload configs/dev.ini
224
224
225 .. note::
225 .. note::
226
226
227 `--reload` flag will automatically reload the server when source file changes.
227 `--reload` flag will automatically reload the server when source file changes.
228
228
229
229
230 Run the Environment Tests
230 Run the Environment Tests
231 ^^^^^^^^^^^^^^^^^^^^^^^^^
231 ^^^^^^^^^^^^^^^^^^^^^^^^^
232
232
233 Please make sure that the tests are passing to verify that your environment is
233 Please make sure that the tests are passing to verify that your environment is
234 set up correctly. RhodeCode uses py.test to run tests.
234 set up correctly. RhodeCode uses py.test to run tests.
235 While your instance is running, start a new nix-shell and simply run
235 While your instance is running, start a new nix-shell and simply run
236 ``make test`` to run the basic test suite.
236 ``make test`` to run the basic test suite.
237
237
238
238
239 Need Help?
239 Need Help?
240 ^^^^^^^^^^
240 ^^^^^^^^^^
241
241
242 Join us on Slack via https://rhodecode.com/join or post questions in our
242 Join us on Slack via https://rhodecode.com/join or post questions in our
243 Community Portal at https://community.rhodecode.com
243 Community Portal at https://community.rhodecode.com
@@ -1,87 +1,93 b''
1 |RCE|
1 |RCE|
2 =====
2 =====
3
3
4 |RCE| is a high-performance source code management and collaboration system.
4 |RCE| is a high-performance source code management and collaboration system.
5 It enables you to develop projects securely behind the firewall while
5 It enables you to develop projects securely behind the firewall while
6 providing collaboration tools that work with |git|, |hg|,
6 providing collaboration tools that work with |git|, |hg|,
7 and |svn| |repos|. The user interface allows you to create, edit,
7 and |svn| |repos|. The user interface allows you to create, edit,
8 and commit files and |repos| while managing their security permissions.
8 and commit files and |repos| while managing their security permissions.
9
9
10 |RCE| provides the following features:
10 |RCE| provides the following features:
11
11
12 * Source code management.
12 * Source code management.
13 * Extended permissions management.
13 * Extended permissions management.
14 * Integrated code collaboration tools.
14 * Integrated code collaboration tools.
15 * Integrated code review and notifications.
15 * Integrated code review and notifications.
16 * Scalability provided by multi-node setup.
16 * Scalability provided by multi-node setup.
17 * Fully programmable automation API.
17 * Fully programmable automation API.
18 * Web-based hook management.
18 * Web-based hook management.
19 * Native |svn| support.
19 * Native |svn| support.
20 * Migration from existing databases.
20 * Migration from existing databases.
21 * |RCE| SDK.
21 * |RCE| SDK.
22 * Built-in analytics
22 * Built-in analytics
23 * Built in integrations including: Slack, Webhooks (used for Jenkins/TeamCity and other CIs), Jira, Redmine, Hipchat
23 * Built in integrations including: Slack, Webhooks (used for Jenkins/TeamCity and other CIs), Jira, Redmine, Hipchat
24 * Pluggable authentication system.
24 * Pluggable authentication system.
25 * Support for AD, |LDAP|, Crowd, CAS, PAM.
25 * Support for AD, |LDAP|, Crowd, CAS, PAM.
26 * Support for external authentication via Oauth Google, Github, Bitbucket, Twitter.
26 * Support for external authentication via Oauth Google, Github, Bitbucket, Twitter.
27 * Debug modes of operation.
27 * Debug modes of operation.
28 * Private and public gists.
28 * Private and public gists.
29 * Gists with limited lifetimes and within instance only sharing.
29 * Gists with limited lifetimes and within instance only sharing.
30 * Fully integrated code search function.
30 * Fully integrated code search function.
31 * Always on SSL connectivity.
31 * Always on SSL connectivity.
32
32
33 .. only:: html
33 .. only:: html
34
34
35 Table of Contents
35 Table of Contents
36 -----------------
36 -----------------
37
37
38 .. toctree::
38 .. toctree::
39 :maxdepth: 1
39 :maxdepth: 1
40 :caption: Admin Documentation
40 :caption: Admin Documentation
41
41
42 install/quick-start
42 install/quick-start
43 install/install-database
43 install/install-database
44 install/install-steps
44 install/install-steps
45 admin/system-overview
45 admin/system-overview
46 nix/default-env
46 nix/default-env
47 admin/system-admin
47 admin/system-admin
48 admin/user-admin
48 admin/user-admin
49 admin/repo-admin
49 admin/repo-admin
50 admin/security-tips
50 admin/security-tips
51 auth/auth
51 auth/auth
52 issue-trackers/issue-trackers
52 issue-trackers/issue-trackers
53 admin/lab-settings
53 admin/lab-settings
54
54
55 .. toctree::
55 .. toctree::
56 :maxdepth: 1
56 :maxdepth: 1
57 :caption: Feature Documentation
57 :caption: Feature Documentation
58
58
59 collaboration/collaboration
59 collaboration/collaboration
60 collaboration/review-notifications
60 collaboration/review-notifications
61 collaboration/pull-requests
61 collaboration/pull-requests
62 code-review/code-review
62 code-review/code-review
63 integrations/integrations
63 integrations/integrations
64
64
65 .. toctree::
65 .. toctree::
66 :maxdepth: 1
66 :maxdepth: 1
67 :caption: User Documentation
67 :caption: User Documentation
68
68
69 usage/basic-usage
69 usage/basic-usage
70 tutorials/tutorials
70 tutorials/tutorials
71
71
72 .. toctree::
72 .. toctree::
73 :maxdepth: 1
73 :maxdepth: 1
74 :caption: Developer Documentation
74 :caption: Developer Documentation
75
75
76 api/api
76 api/api
77 tools/rhodecode-tools
77 tools/rhodecode-tools
78 extensions/extensions-hooks
78 extensions/extensions-hooks
79 contributing/contributing
79 contributing/contributing
80
80
81 .. toctree::
81 .. toctree::
82 :maxdepth: 2
83 :caption: RhodeCode Control Documentation
84
85 RhodeCode Installer <https://docs.rhodecode.com/RhodeCode-Control/>
86
87 .. toctree::
82 :maxdepth: 1
88 :maxdepth: 1
83 :caption: About
89 :caption: About
84
90
85 known-issues/known-issues
91 known-issues/known-issues
86 release-notes/release-notes
92 release-notes/release-notes
87 admin/glossary
93 admin/glossary
@@ -1,75 +1,85 b''
1
1
2 .. _config-celery:
2 .. _config-celery:
3
3
4 Configure Celery
4 Configure Celery
5 ----------------
5 ----------------
6
6
7 Celery_ is an asynchronous task queue. It's a part of RhodeCode scheduler
7 Celery_ is an asynchronous task queue. It's a part of RhodeCode scheduler
8 functionality. Celery_ makes certain heavy tasks perform more efficiently.
8 functionality. Celery_ makes certain heavy tasks perform more efficiently.
9 Most important it allows sending notification emails, create repository forks,
9 Most important it allows sending notification emails, create repository forks,
10 and import repositories in async way. It is also used for bi-directional
10 and import repositories in async way. It is also used for bi-directional
11 repository sync in scheduler.
11 repository sync in scheduler.
12
12
13 If you decide to use Celery you also need a working message queue.
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 In order to install and configure Celery, follow these steps:
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
23 1. Install RabbitMQ or Redis for a message queue, see the documentation on the Celery website for
20 `rabbitmq installation`_, or `rabbitmq website installation`_
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 sudo rabbitmqctl add_user rcuser secret_password
29 sudo rabbitmqctl add_user rcuser secret_password
26 sudo rabbitmqctl add_vhost rhodevhost
30 sudo rabbitmqctl add_vhost rhodevhost
27 sudo rabbitmqctl set_user_tags rcuser rhodecode
31 sudo rabbitmqctl set_user_tags rcuser rhodecode
28 sudo rabbitmqctl set_permissions -p rhodevhost rcuser ".*" ".*" ".*"
32 sudo rabbitmqctl set_permissions -p rhodevhost rcuser ".*" ".*" ".*"
29
33
30
34
31 2. Enable celery, and install `celery worker` process script using the `enable-module`::
35 2. Enable celery, and install `celery worker` process script using the `enable-module`::
32
36
33 rccontrol enable-module celery {instance-id}
37 rccontrol enable-module celery {instance-id}
34
38
35 .. note::
39 .. note::
36
40
37 In case when using multiple instances in one or multiple servers it's highly
41 In case when using multiple instances in one or multiple servers it's highly
38 recommended that celery is running only once, for all servers connected to
42 recommended that celery is running only once, for all servers connected to
39 the same database. Having multiple celery instances running without special
43 the same database. Having multiple celery instances running without special
40 reconfiguration could cause scheduler issues.
44 reconfiguration could cause scheduler issues.
41
45
42
46
43 3. Configure Celery in the
47 3. Configure Celery in the
44 :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
48 :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
45 Set the broker_url as minimal settings required to enable operation.
49 Set the broker_url as minimal settings required to enable operation.
46 If used our example data from pt 1a, here is how the broker url should look like::
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 celery.broker_url = amqp://rcuser:secret_password@localhost:5672/rhodevhost
56 celery.broker_url = amqp://rcuser:secret_password@localhost:5672/rhodevhost
49
57
50 Full configuration example is below:
58 Full configuration example is below:
51
59
52 .. code-block:: ini
60 .. code-block:: ini
53
61
54 # Set this section of the ini file to match your Celery installation
62 # Set this section of the ini file to match your Celery installation
55 ####################################
63 ####################################
56 ### CELERY CONFIG ####
64 ### CELERY CONFIG ####
57 ####################################
65 ####################################
58
66
59 use_celery = true
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 # maximum tasks to execute before worker restart
70 # maximum tasks to execute before worker restart
63 celery.max_tasks_per_child = 100
71 celery.max_tasks_per_child = 100
64
72
65 ## tasks will never be sent to the queue, but executed locally instead.
73 ## tasks will never be sent to the queue, but executed locally instead.
66 celery.task_always_eager = false
74 celery.task_always_eager = false
67
75
68
76
69 .. _python: http://www.python.org/
77 .. _python: http://www.python.org/
70 .. _mercurial: http://mercurial.selenic.com/
78 .. _mercurial: http://mercurial.selenic.com/
71 .. _celery: http://celeryproject.org/
79 .. _celery: http://celeryproject.org/
80 .. _redis: http://redis.io
81 .. _redis installation: https://redis.io/topics/quickstart
72 .. _rabbitmq: http://www.rabbitmq.com/
82 .. _rabbitmq: http://www.rabbitmq.com/
73 .. _rabbitmq installation: http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html
83 .. _rabbitmq installation: http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html
74 .. _rabbitmq website installation: http://www.rabbitmq.com/download.html
84 .. _rabbitmq website installation: http://www.rabbitmq.com/download.html
75 .. _Celery installation: http://docs.celeryproject.org/en/latest/getting-started/introduction.html#bundles
85 .. _Celery installation: http://docs.celeryproject.org/en/latest/getting-started/introduction.html#bundles
@@ -1,38 +1,37 b''
1 .. _config-database:
1 .. _config-database:
2
2
3 Make Database Changes
3 Make Database Changes
4 ---------------------
4 ---------------------
5
5
6 .. important::
6 .. important::
7
7
8 If you do change the |repo| database that |RCEE| uses, then you will need to
8 If you do change the |repo| database that |RCEE| uses, then you will need to
9 upgrade the database, and also remap and rescan the |repos|. More detailed
9 upgrade the database, and also remap and rescan the |repos|. More detailed
10 information is available in the
10 information is available in the
11 :ref:`Alternative upgrade documentation <control:install-port>`.
11 :ref:`Alternative upgrade documentation <control:install-port>`.
12
12
13 If you need to change database connection details for a |RCEE| instance,
13 If you need to change database connection details for a |RCEE| instance,
14 use the following steps:
14 use the following steps:
15
15
16 1. Open the :file:`rhodecode.ini` file for the instance you wish to edit. The
16 1. Open the :file:`rhodecode.ini` file for the instance you wish to edit. The
17 default location is
17 default location is
18 :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
18 :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
19 2. When you open the file, find the database configuration section,
19 2. When you open the file, find the database configuration section,
20 and use the below example to change the
20 and use the below example to change the
21 connection details:
21 connection details:
22
22
23 .. code-block:: ini
23 .. code-block:: ini
24
24
25 #########################################################
25 #########################################################
26 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
26 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
27 #########################################################
27 #########################################################
28
28
29 # Default SQLite config
29 # Default SQLite config
30 sqlalchemy.db1.url = sqlite:////home/brian/.rccontrol/enterprise-1/rhodecode.db
30 sqlalchemy.db1.url = sqlite:////home/brian/.rccontrol/enterprise-1/rhodecode.db
31
31
32 # Use this example for a PostgreSQL
32 # Use this example for a PostgreSQL
33 sqlalchemy.db1.url = postgresql://postgres:qwe@localhost/rhodecode
33 sqlalchemy.db1.url = postgresql://postgres:qwe@localhost/rhodecode
34
34
35 # see sqlalchemy docs for other advanced settings
35 # see sqlalchemy docs for other advanced settings
36 sqlalchemy.db1.echo = false
36 sqlalchemy.db1.echo = false
37 sqlalchemy.db1.pool_recycle = 3600
37 sqlalchemy.db1.pool_recycle = 3600
38 sqlalchemy.db1.convert_unicode = true
@@ -1,81 +1,76 b''
1 .. _rhodecode-issue-trackers-ref:
1 .. _rhodecode-issue-trackers-ref:
2
2
3 Issue Tracker Integration
3 Issue Tracker Integration
4 =========================
4 =========================
5
5
6 You can set an issue tracker connection in two ways with |RCE|.
6 You can set an issue tracker connection in two ways with |RCE|.
7
7
8 * At the instance level, you can set a default issue tracker.
8 * At the instance level, you can set a default issue tracker.
9 * At the |repo| level, you can configure an integration with a different issue
9 * At the |repo| level, you can configure an integration with a different issue
10 tracker.
10 tracker.
11
11
12 To integrate |RCE| with an issue tracker, you need to define a regular
12 To integrate |RCE| with an issue tracker, you need to define a regular
13 expression that will fetch the issue ID stored in commit messages, and replace
13 expression that will fetch the issue ID stored in commit messages, and replace
14 it with a URL. This enables |RCE| to generate a link matching each issue to the
14 it with a URL. This enables |RCE| to generate a link matching each issue to the
15 target |repo|.
15 target |repo|.
16
16
17 Default Issue Tracker Configuration
17 Default Issue Tracker Configuration
18 -----------------------------------
18 -----------------------------------
19
19
20 To integrate your issue tracker, use the following steps:
20 To integrate your issue tracker, use the following steps:
21
21
22 1. Open :menuselection:`Admin --> Settings --> Issue Tracker`.
22 1. Open :menuselection:`Admin --> Settings --> Issue Tracker`.
23 2. In the new entry field, enter the following information:
23 2. In the new entry field, enter the following information:
24
24
25 * :guilabel:`Description`: A name for this set of rules.
25 * :guilabel:`Description`: A name for this set of rules.
26 * :guilabel:`Pattern`: The regular expression that will match issues
26 * :guilabel:`Pattern`: The regular expression that will match issues
27 tagged in commit messages, or more see :ref:`issue-tr-eg-ref`.
27 tagged in commit messages, or more see :ref:`issue-tr-eg-ref`.
28 * :guilabel:`URL`: The URL to your issue tracker.
28 * :guilabel:`URL`: The URL to your issue tracker.
29 * :guilabel:`Prefix`: The prefix with which you want to mark issues.
29 * :guilabel:`Prefix`: The prefix with which you want to mark issues.
30
30
31 3. Select **Add** so save the rule to your issue tracker configuration.
31 3. Select **Add** so save the rule to your issue tracker configuration.
32
32
33 Repository Issue Tracker Configuration
33 Repository Issue Tracker Configuration
34 --------------------------------------
34 --------------------------------------
35
35
36 You can configure specific |repos| to use a different issue tracker than the
36 You can configure specific |repos| to use a different issue tracker than the
37 default one. See the instructions in :ref:`repo-it`
37 default one. See the instructions in :ref:`repo-it`
38
38
39 .. _issue-tr-eg-ref:
39 .. _issue-tr-eg-ref:
40
40
41
41 Jira Integration
42 Jira Integration
42 ----------------
43 ----------------
43
44
44 * Regex = ``(?:^#|\s#)(\w+-\d+)``
45 Please check examples in the view for configuration the issue trackers.
45 * URL = ``https://myissueserver.com/browse/${id}``
46
46 * Issue Prefix = ``#``
47
47
48 Confluence (Wiki)
48 Confluence (Wiki)
49 -----------------
49 -----------------
50
50
51 * Regex = ``(?:conf-)([A-Z0-9]+)``
51 Please check examples in the view for configuration the issue trackers.
52 * URL = ``https://example.atlassian.net/display/wiki/${id}/${repo_name}``
52
53 * issue prefix = ``CONF-``
54
53
55 Redmine Integration
54 Redmine Integration
56 -------------------
55 -------------------
57
56
58 * Regex = ``(issue-+\d+)``
57 Please check examples in the view for configuration the issue trackers.
59 * URL = ``https://myissueserver.com/redmine/issue/${id}``
58
60 * Issue Prefix = ``issue-``
61
59
62 Redmine (wiki)
60 Redmine wiki Integration
63 --------------
61 ------------------------
64
62
65 * Regex = ``(?:wiki-)([a-zA-Z0-9]+)``
63 Please check examples in the view for configuration the issue trackers.
66 * URL = ``https://example.com/redmine/projects/wiki/${repo_name}``
64
67 * Issue prefix = ``Issue-``
68
65
69 Pivotal Tracker
66 Pivotal Tracker
70 ---------------
67 ---------------
71
68
72 * Regex = ``(?:pivot-)(?<project_id>\d+)-(?<story>\d+)``
69 Please check examples in the view for configuration the issue trackers.
73 * URL = ``https://www.pivotaltracker.com/s/projects/${project_id}/stories/${story}``
70
74 * Issue prefix = ``Piv-``
75
71
76 Trello
72 Trello
77 ------
73 ------
78
74
79 * Regex = ``(?:trello-)(?<card_id>[a-zA-Z0-9]+)``
75 Please check examples in the view for configuration the issue trackers.
80 * URL = ``https://trello.com/example.com/${card_id}``
76
81 * Issue prefix = ``Trello-``
@@ -1,85 +1,85 b''
1 |RCE| 4.17.0 |RNS|
1 |RCE| 4.17.0 |RNS|
2 ------------------
2 ------------------
3
3
4 Release Date
4 Release Date
5 ^^^^^^^^^^^^
5 ^^^^^^^^^^^^
6
6
7 - 2019-07-04
7 - 2019-07-04
8
8
9
9
10 New Features
10 New Features
11 ^^^^^^^^^^^^
11 ^^^^^^^^^^^^
12
12
13 - New artifacts feature.
13 - New artifacts feature.
14 Ability to store binary artifacts for repository with ACL
14 Ability to store binary artifacts for repository with ACL
15 - UI/UX refresh for most of the pages. This includes multiple fixes and improvements.
15 - UI/UX refresh for most of the pages. This includes multiple fixes and improvements.
16 - Diffs: store wide-diff mode in user sessions to store user preference for diff display.
16 - Diffs: store wide-diff mode in user sessions to store user preference for diff display.
17 - Mercurial: added support for Mercurial 4.9
17 - Mercurial: added support for Mercurial 4.9
18 - API: Added search API methods
18 - API: Added search API methods
19 - Files: adding/editing allows previews for generated content.
19 - Files: adding/editing allows previews for generated content.
20 - Files: allowed multi file upload using UI.
20 - Files: allowed multi file upload using UI.
21 - Repository Groups: last change is now smartly calculated based on latest change
21 - Repository Groups: last change is now smartly calculated based on latest change
22 from all it's children repositories.
22 from all it's children repositories.
23 - Archives: it's now currently possible to download partial directories from files view.
23 - Archives: it's now currently possible to download partial directories from files view.
24 - SVN: allowed executing pre-commit code with rcextensions, also added example to
24 - SVN: allowed executing pre-commit code with rcextensions, also added example to
25 validate SVN file size and paths on pre-commit level.
25 validate SVN file size and paths on pre-commit level.
26
26
27
27
28 General
28 General
29 ^^^^^^^
29 ^^^^^^^
30 - Exception store: add filter for display and deletion.
30 - Exception store: add filter for display and deletion.
31 - Files: loading history doesn't display hidden and obsolete commits anymore.
31 - Files: loading history doesn't display hidden and obsolete commits anymore.
32 - Repositories: bring back missing watch action in summary view.
32 - Repositories: bring back missing watch action in summary view.
33 - Admin: user groups is now using pure DB filtering to speed up display
33 - Admin: user groups is now using pure DB filtering to speed up display
34 for large number of groups.
34 for large number of groups.
35 - Mercurial: enabled full evolve+topic extensions when evolve is enabled.
35 - Mercurial: enabled full evolve+topic extensions when evolve is enabled.
36 - Dependencies: bumped evolve to 8.5.1
36 - Dependencies: bumped evolve to 8.5.1
37 - Dependencies: bumped pyramid to 1.10.4
37 - Dependencies: bumped pyramid to 1.10.4
38 - Dependencies: bumped psutil to 5.5.1
38 - Dependencies: bumped psutil to 5.5.1
39 - Dependencies: bumped pygments to 2.4.2
39 - Dependencies: bumped pygments to 2.4.2
40 - Dependencies: bumped pyramid to 1.10.4
40 - Dependencies: bumped pyramid to 1.10.4
41 - Dependencies: bumped psycopg2 to 2.8.3
41 - Dependencies: bumped psycopg2 to 2.8.3
42 - Dependencies [security]: updated colander to 1.7.0
42 - Dependencies [security]: updated colander to 1.7.0
43
43
44
44
45 Security
45 Security
46 ^^^^^^^^
46 ^^^^^^^^
47
47
48 - SSH: replaced pycrypto with cryptography to generate SSH keys as pycrypto isn't
48 - SSH: replaced pycrypto with cryptography to generate SSH keys as pycrypto isn't
49 considered safe anymore.
49 considered safe anymore.
50
50
51
51
52 Performance
52 Performance
53 ^^^^^^^^^^^
53 ^^^^^^^^^^^
54
54
55 - Config: updated header limits on gunicorn to prevent errors on large Mercurial repositories.
55 - Config: updated header limits on gunicorn to prevent errors on large Mercurial repositories.
56 - User sessions: added option to cleanup redis based sessions in user session interface.
56 - User sessions: added option to cleanup redis based sessions in user session interface.
57 - Authentication: reduced usage of raw auth calls inside templates to speed up rendering.
57 - Authentication: reduced usage of raw auth calls inside templates to speed up rendering.
58 - Sessions: don't touch session for API calls. Before each API call created new session
58 - Sessions: don't touch session for API calls. Before each API call created new session
59 object which wasn't required.
59 object which wasn't required.
60
60
61
61
62 Fixes
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 - Mercurial: fix ssh-server support for mercurial custom options.
66 - Mercurial: fix ssh-server support for mercurial custom options.
67 - Pull requests: updated metadata information for failed merges with multiple heads.
67 - Pull requests: updated metadata information for failed merges with multiple heads.
68 - Pull requests: calculate ancestor in the same way as creation mode.
68 - Pull requests: calculate ancestor in the same way as creation mode.
69 Fixed problem with updates generating wrong diffs in case of merges.
69 Fixed problem with updates generating wrong diffs in case of merges.
70 - Pull requests: fixed a bug in removal of multiple reviewers at once.
70 - Pull requests: fixed a bug in removal of multiple reviewers at once.
71 - Summary: fix timeout issues loading summary page without styling.
71 - Summary: fix timeout issues loading summary page without styling.
72 - SSH: fix invocation of custom hgrc.
72 - SSH: fix invocation of custom hgrc.
73 - SSH: call custom hooks via SSH backend
73 - SSH: call custom hooks via SSH backend
74 - Markup: fix styling for check-lists.
74 - Markup: fix styling for check-lists.
75 - Archives: allows downloading refs that have slashes and special refs. e.g f/feat1 branch names.
75 - Archives: allows downloading refs that have slashes and special refs. e.g f/feat1 branch names.
76 - Files: ensure we generate archives with consistent hashing (except for .tar.gz which uses temp files names in header)
76 - Files: ensure we generate archives with consistent hashing (except for .tar.gz which uses temp files names in header)
77 - Files: fixed rendering of readme files under non-ascii paths.
77 - Files: fixed rendering of readme files under non-ascii paths.
78
78
79
79
80 Upgrade notes
80 Upgrade notes
81 ^^^^^^^^^^^^^
81 ^^^^^^^^^^^^^
82
82
83 - In this release we introduced new UI across the application.
83 - In this release we introduced new UI across the application.
84 In case of problems with the display on your systems please send us info to support@rhodecode.com.
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 .. _rhodecode-release-notes-ref:
1 .. _rhodecode-release-notes-ref:
2
2
3 Release Notes
3 Release Notes
4 =============
4 =============
5
5
6 |RCE| 4.x Versions
6 |RCE| 4.x Versions
7 ------------------
7 ------------------
8
8
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.18.0.rst
12 release-notes-4.17.4.rst
13 release-notes-4.17.4.rst
13 release-notes-4.17.3.rst
14 release-notes-4.17.3.rst
14 release-notes-4.17.2.rst
15 release-notes-4.17.2.rst
15 release-notes-4.17.1.rst
16 release-notes-4.17.1.rst
16 release-notes-4.17.0.rst
17 release-notes-4.17.0.rst
17 release-notes-4.16.2.rst
18 release-notes-4.16.2.rst
18 release-notes-4.16.1.rst
19 release-notes-4.16.1.rst
19 release-notes-4.16.0.rst
20 release-notes-4.16.0.rst
20 release-notes-4.15.2.rst
21 release-notes-4.15.2.rst
21 release-notes-4.15.1.rst
22 release-notes-4.15.1.rst
22 release-notes-4.15.0.rst
23 release-notes-4.15.0.rst
23 release-notes-4.14.1.rst
24 release-notes-4.14.1.rst
24 release-notes-4.14.0.rst
25 release-notes-4.14.0.rst
25 release-notes-4.13.3.rst
26 release-notes-4.13.3.rst
26 release-notes-4.13.2.rst
27 release-notes-4.13.2.rst
27 release-notes-4.13.1.rst
28 release-notes-4.13.1.rst
28 release-notes-4.13.0.rst
29 release-notes-4.13.0.rst
29 release-notes-4.12.4.rst
30 release-notes-4.12.4.rst
30 release-notes-4.12.3.rst
31 release-notes-4.12.3.rst
31 release-notes-4.12.2.rst
32 release-notes-4.12.2.rst
32 release-notes-4.12.1.rst
33 release-notes-4.12.1.rst
33 release-notes-4.12.0.rst
34 release-notes-4.12.0.rst
34 release-notes-4.11.6.rst
35 release-notes-4.11.6.rst
35 release-notes-4.11.5.rst
36 release-notes-4.11.5.rst
36 release-notes-4.11.4.rst
37 release-notes-4.11.4.rst
37 release-notes-4.11.3.rst
38 release-notes-4.11.3.rst
38 release-notes-4.11.2.rst
39 release-notes-4.11.2.rst
39 release-notes-4.11.1.rst
40 release-notes-4.11.1.rst
40 release-notes-4.11.0.rst
41 release-notes-4.11.0.rst
41 release-notes-4.10.6.rst
42 release-notes-4.10.6.rst
42 release-notes-4.10.5.rst
43 release-notes-4.10.5.rst
43 release-notes-4.10.4.rst
44 release-notes-4.10.4.rst
44 release-notes-4.10.3.rst
45 release-notes-4.10.3.rst
45 release-notes-4.10.2.rst
46 release-notes-4.10.2.rst
46 release-notes-4.10.1.rst
47 release-notes-4.10.1.rst
47 release-notes-4.10.0.rst
48 release-notes-4.10.0.rst
48 release-notes-4.9.1.rst
49 release-notes-4.9.1.rst
49 release-notes-4.9.0.rst
50 release-notes-4.9.0.rst
50 release-notes-4.8.0.rst
51 release-notes-4.8.0.rst
51 release-notes-4.7.2.rst
52 release-notes-4.7.2.rst
52 release-notes-4.7.1.rst
53 release-notes-4.7.1.rst
53 release-notes-4.7.0.rst
54 release-notes-4.7.0.rst
54 release-notes-4.6.1.rst
55 release-notes-4.6.1.rst
55 release-notes-4.6.0.rst
56 release-notes-4.6.0.rst
56 release-notes-4.5.2.rst
57 release-notes-4.5.2.rst
57 release-notes-4.5.1.rst
58 release-notes-4.5.1.rst
58 release-notes-4.5.0.rst
59 release-notes-4.5.0.rst
59 release-notes-4.4.2.rst
60 release-notes-4.4.2.rst
60 release-notes-4.4.1.rst
61 release-notes-4.4.1.rst
61 release-notes-4.4.0.rst
62 release-notes-4.4.0.rst
62 release-notes-4.3.1.rst
63 release-notes-4.3.1.rst
63 release-notes-4.3.0.rst
64 release-notes-4.3.0.rst
64 release-notes-4.2.1.rst
65 release-notes-4.2.1.rst
65 release-notes-4.2.0.rst
66 release-notes-4.2.0.rst
66 release-notes-4.1.2.rst
67 release-notes-4.1.2.rst
67 release-notes-4.1.1.rst
68 release-notes-4.1.1.rst
68 release-notes-4.1.0.rst
69 release-notes-4.1.0.rst
69 release-notes-4.0.1.rst
70 release-notes-4.0.1.rst
70 release-notes-4.0.0.rst
71 release-notes-4.0.0.rst
71
72
72 |RCE| 3.x Versions
73 |RCE| 3.x Versions
73 ------------------
74 ------------------
74
75
75 .. toctree::
76 .. toctree::
76 :maxdepth: 1
77 :maxdepth: 1
77
78
78 release-notes-3.8.4.rst
79 release-notes-3.8.4.rst
79 release-notes-3.8.3.rst
80 release-notes-3.8.3.rst
80 release-notes-3.8.2.rst
81 release-notes-3.8.2.rst
81 release-notes-3.8.1.rst
82 release-notes-3.8.1.rst
82 release-notes-3.8.0.rst
83 release-notes-3.8.0.rst
83 release-notes-3.7.1.rst
84 release-notes-3.7.1.rst
84 release-notes-3.7.0.rst
85 release-notes-3.7.0.rst
85 release-notes-3.6.1.rst
86 release-notes-3.6.1.rst
86 release-notes-3.6.0.rst
87 release-notes-3.6.0.rst
87 release-notes-3.5.2.rst
88 release-notes-3.5.2.rst
88 release-notes-3.5.1.rst
89 release-notes-3.5.1.rst
89 release-notes-3.5.0.rst
90 release-notes-3.5.0.rst
90 release-notes-3.4.1.rst
91 release-notes-3.4.1.rst
91 release-notes-3.4.0.rst
92 release-notes-3.4.0.rst
92 release-notes-3.3.4.rst
93 release-notes-3.3.4.rst
93 release-notes-3.3.3.rst
94 release-notes-3.3.3.rst
94 release-notes-3.3.2.rst
95 release-notes-3.3.2.rst
95 release-notes-3.3.1.rst
96 release-notes-3.3.1.rst
96 release-notes-3.3.0.rst
97 release-notes-3.3.0.rst
97 release-notes-3.2.3.rst
98 release-notes-3.2.3.rst
98 release-notes-3.2.2.rst
99 release-notes-3.2.2.rst
99 release-notes-3.2.1.rst
100 release-notes-3.2.1.rst
100 release-notes-3.2.0.rst
101 release-notes-3.2.0.rst
101 release-notes-3.1.1.rst
102 release-notes-3.1.1.rst
102 release-notes-3.1.0.rst
103 release-notes-3.1.0.rst
103 release-notes-3.0.2.rst
104 release-notes-3.0.2.rst
104 release-notes-3.0.1.rst
105 release-notes-3.0.1.rst
105 release-notes-3.0.0.rst
106 release-notes-3.0.0.rst
106
107
107 |RCE| 2.x Versions
108 |RCE| 2.x Versions
108 ------------------
109 ------------------
109
110
110 .. toctree::
111 .. toctree::
111 :maxdepth: 1
112 :maxdepth: 1
112
113
113 release-notes-2.2.8.rst
114 release-notes-2.2.8.rst
114 release-notes-2.2.7.rst
115 release-notes-2.2.7.rst
115 release-notes-2.2.6.rst
116 release-notes-2.2.6.rst
116 release-notes-2.2.5.rst
117 release-notes-2.2.5.rst
117 release-notes-2.2.4.rst
118 release-notes-2.2.4.rst
118 release-notes-2.2.3.rst
119 release-notes-2.2.3.rst
119 release-notes-2.2.2.rst
120 release-notes-2.2.2.rst
120 release-notes-2.2.1.rst
121 release-notes-2.2.1.rst
121 release-notes-2.2.0.rst
122 release-notes-2.2.0.rst
122 release-notes-2.1.0.rst
123 release-notes-2.1.0.rst
123 release-notes-2.0.2.rst
124 release-notes-2.0.2.rst
124 release-notes-2.0.1.rst
125 release-notes-2.0.1.rst
125 release-notes-2.0.0.rst
126 release-notes-2.0.0.rst
126
127
127 |RCE| 1.x Versions
128 |RCE| 1.x Versions
128 ------------------
129 ------------------
129
130
130 .. toctree::
131 .. toctree::
131 :maxdepth: 1
132 :maxdepth: 1
132
133
133 release-notes-1.7.2.rst
134 release-notes-1.7.2.rst
134 release-notes-1.7.1.rst
135 release-notes-1.7.1.rst
135 release-notes-1.7.0.rst
136 release-notes-1.7.0.rst
136 release-notes-1.6.0.rst
137 release-notes-1.6.0.rst
@@ -1,85 +1,88 b''
1 .. _install-tools:
1 .. _install-tools:
2
2
3 |RCT| Installation
3 |RCT| Installation
4 ------------------
4 ------------------
5
5
6 As of |RCE| 3.4.1 |RCT| is installed automatically on the server with |RCE|. You
6 As of |RCE| 3.4.1 |RCT| is installed automatically on the server with |RCE|. You
7 do not need to install |RCT| on the server, but you will need to install them
7 do not need to install |RCT| on the server, but you will need to install them
8 on machines that need remote access. The tools are linked to the instance
8 on machines that need remote access. The tools are linked to the instance
9 folder, for example :file:`~/.rccontrol/{instance-id}/profile/bin`
9 folder, for example :file:`~/.rccontrol/{instance-id}/profile/bin`
10
10
11 You can list the available tools using the following example, and the valid
11 You can list the available tools using the following example, and the valid
12 tools options are those which correspond with those in the :ref:`rc-tools`
12 tools options are those which correspond with those in the :ref:`rc-tools`
13 section.
13 section.
14
14
15 .. code-block:: bash
15 .. code-block:: bash
16
16
17 $ ls ~/.rccontrol/enterprise-4/profile/bin/
17 $ ls ~/.rccontrol/enterprise-4/profile/bin/
18
18
19 gen_js_i18n rhodecode-cleanup-gists rhodecode-tools svnrdump
19 gen_js_i18n rhodecode-cleanup-gists rhodecode-tools svnrdump
20 gen_js_routes rhodecode-cleanup-repos supervisorctl svnserve
20 gen_js_routes rhodecode-cleanup-repos supervisorctl svnserve
21 git rhodecode-config supervisord svnsync
21 git rhodecode-config supervisord svnsync
22 gunicorn rhodecode-extensions svn svnversion
22 gunicorn rhodecode-extensions svn svnversion
23 hg rhodecode-gist svnadmin vcsserver
23 hg rhodecode-gist svnadmin vcsserver
24 paster rhodecode-index svndumpfilter
24 paster rhodecode-index svndumpfilter
25 rc-server rhodecode-list-instances svnlook
25 rc-server rhodecode-list-instances svnlook
26 rhodecode-api rhodecode-setup-config svnmucc
26 rhodecode-api rhodecode-setup-config svnmucc
27
27
28 You can then use the tools as described in the :ref:`rc-tools` section using the
28 You can then use the tools as described in the :ref:`rc-tools` section using the
29 following example:
29 following example:
30
30
31 .. code-block:: bash
31 .. code-block:: bash
32
32
33 # Running the indexer
33 # Running the indexer
34 $ ~/.rccontrol/enterprise-1/profile/bin/rhodecode-index \
34 $ ~/.rccontrol/enterprise-1/profile/bin/rhodecode-index \
35 --instance-name=enterprise-1
35 --instance-name=enterprise-1
36
36
37 # Cleaning up gists
37 # Cleaning up gists
38 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-cleanup-gists \
38 $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-cleanup-gists \
39 --instance-name=enterprise-4
39 --instance-name=enterprise-4
40
40
41 Scanning for gists in /home/brian/repos/.rc_gist_store...
41 Scanning for gists in /home/brian/repos/.rc_gist_store...
42 preparing to remove [1] found gists
42 preparing to remove [1] found gists
43
43
44 Installing |RCT|
44 Installing |RCT|
45 ^^^^^^^^^^^^^^^^
45 ^^^^^^^^^^^^^^^^
46
46
47 |RCT| enable you to automate many of the most common |RCE| functions through
47 |RCT| enable you to automate many of the most common |RCE| functions through
48 the API. Installing them on a local machine lets you carry out maintenance on
48 the API. Installing them on a local machine lets you carry out maintenance on
49 the server remotely. Once installed you can use them to index your |repos|
49 the server remotely. Once installed you can use them to index your |repos|
50 to setup full-text search, strip commits, or install RhodeCode Extensions for
50 to setup full-text search, strip commits, or install RhodeCode Extensions for
51 additional functionality.
51 additional functionality.
52
52
53 For more detailed instructions about using |RCT| for indexing and full-text
53 For more detailed instructions about using |RCT| for indexing and full-text
54 search, see :ref:`indexing-ref`
54 search, see :ref:`indexing-ref`
55
55
56 To install |RCT|, use the following steps:
56 To install |RCT|, use the following steps:
57
57
58 1. Set up a ``virtualenv`` on your local machine, see virtualenv_ instructions
58 1. Set up a ``virtualenv`` on your local machine, see virtualenv_ instructions
59 here.
59 here.
60 2. Install |RCT| using pip. Full url with token is available at https://rhodecode.com/u/#rhodecode-tools
60 2. Install |RCT| using pip. All downloadable versions of |RCT| are available at:
61 ``pip install -I https://dls.rhodecode.com/dls/<token>/rhodecode-tools/latest``
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 Once |RCT| is installed using these steps there are a few extra
67 Once |RCT| is installed using these steps there are a few extra
65 configuration changes you can make. These are explained in more detail in the
68 configuration changes you can make. These are explained in more detail in the
66 :ref:`indexing-ref` section, and the :ref:`rc-tools` section.
69 :ref:`indexing-ref` section, and the :ref:`rc-tools` section.
67
70
68 .. code-block:: bash
71 .. code-block:: bash
69
72
70 # Create a virtualenv
73 # Create a virtualenv
71 brian@ubuntu:~$ virtualenv venv
74 brian@ubuntu:~$ virtualenv venv
72 New python executable in venv/bin/python
75 New python executable in venv/bin/python
73 Installing setuptools, pip...done.
76 Installing setuptools, pip...done.
74
77
75 # Activate the virtualenv
78 # Activate the virtualenv
76 brian@ubuntu:~$ . venv/bin/activate
79 brian@ubuntu:~$ . venv/bin/activate
77
80
78 # Install RhodeCode Tools inside the virtualenv, full url with token is available at https://rhodecode.com/u/#rhodecode-tools
81 # Install RhodeCode Tools inside the virtualenv, full url with token is available at https://rhodecode.com/u/#rhodecode-tools
79 $ pip install -I https://dls.rhodecode.com/dls/<token>/rhodecode-tools/latest
82 $ pip install -I https://dls.rhodecode.com/dls/<token>/rhodecode-tools/latest
80
83
81 # Check the installation
84 # Check the installation
82 $ rhodecode-tools --help
85 $ rhodecode-tools --help
83
86
84 .. _virtualenv: https://virtualenv.pypa.io/en/latest/index.html
87 .. _virtualenv: https://virtualenv.pypa.io/en/latest/index.html
85
88
@@ -1,59 +1,59 b''
1 .. _keyboard-shortcuts:
1 .. _keyboard-shortcuts:
2
2
3 Keyboard Shortcuts
3 Keyboard Shortcuts
4 ==================
4 ==================
5
5
6 |RCE| has a number of user interface shortcut keys.
6 |RCE| has a number of user interface shortcut keys.
7
7
8 System Wide Shortcuts
8 System Wide Shortcuts
9 ---------------------
9 ---------------------
10
10
11 .. rst-class:: dl-horizontal
11 .. rst-class:: dl-horizontal
12
12
13 \--:kbd:`/`
13 \--:kbd:`/`
14 Open the |repo| search box.
14 Open the |repo| search box.
15
15
16 \--:kbd:`?`
16 \--:kbd:`?`
17 Open the |RCE| keyboard shortcuts page.
17 Open the |RCE| keyboard shortcuts page.
18
18
19 \--:kbd:`gh`
19 \--:kbd:`gh`
20 Go to the home page.
20 Go to the home page.
21
21
22 \--:kbd:`gg`
22 \--:kbd:`gg`
23 Go to my private gists page.
23 Go to my private gists page.
24
24
25 \--:kbd:`gG`
25 \--:kbd:`gG`
26 Go to my public gists page.
26 Go to my public gists page.
27
27
28 \--:kbd:`nr`
28 \--:kbd:`nr`
29 Go to the create new repository page.
29 Go to the create new repository page.
30
30
31 \--:kbd:`ng`
31 \--:kbd:`ng`
32 Go to the new gist page.
32 Go to the new gist page.
33
33
34 Repository Shortcuts
34 Repository Shortcuts
35 --------------------
35 --------------------
36
36
37 .. rst-class:: dl-horizontal
37 .. rst-class:: dl-horizontal
38
38
39
39
40 \--:kbd:`gs`
40 \--:kbd:`gs`
41 Go to the |repo| summary page.
41 Go to the |repo| summary page.
42
42
43 \--:kbd:`gc`
43 \--:kbd:`gc`
44 Go to the changelog page.
44 Go to the changelog page.
45
45
46 \--:kbd:`gf`
46 \--:kbd:`gf`
47 Go to the files page.
47 Go to the files page.
48
48
49 \--:kbd:`gF`
49 \--:kbd:`gF`
50 Go to the files page with file search activated.
50 Go to the files page with file search activated.
51
51
52 \--:kbd:`gp`
52 \--:kbd:`gp`
53 Go to the pull requests page.
53 Go to the pull requests page.
54
54
55 \--:kbd:`go`
55 \--:kbd:`go`
56 Go to the repository settings page.
56 Go to the repository settings page.
57
57
58 \--:kbd:`gO`
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 "dirs": {
2 "dirs": {
3 "css": {
3 "css": {
4 "src": "rhodecode/public/css",
4 "src": "rhodecode/public/css",
5 "dest": "rhodecode/public/css"
5 "dest": "rhodecode/public/css"
6 },
6 },
7 "js": {
7 "js": {
8 "src": "rhodecode/public/js/src",
8 "src": "rhodecode/public/js/src",
9 "src_rc": "rhodecode/public/js/rhodecode",
9 "src_rc": "rhodecode/public/js/rhodecode",
10 "dest": "rhodecode/public/js",
10 "dest": "rhodecode/public/js",
11 "node_modules": "node_modules"
11 "node_modules": "node_modules"
12 }
12 }
13 },
13 },
14 "copy": {
14 "copy": {
15 "main": {
15 "main": {
16 "files": [
16 "files": [
17 {
17 {
18 "expand": true,
18 "expand": true,
19 "cwd": "node_modules/@webcomponents",
19 "cwd": "node_modules/@webcomponents",
20 "src": "webcomponentsjs/*.*",
20 "src": "webcomponentsjs/*.*",
21 "dest": "<%= dirs.js.dest %>/vendors"
21 "dest": "<%= dirs.js.dest %>/vendors"
22 },
22 },
23 {
23 {
24 "src": "<%= dirs.css.src %>/style-polymer.css",
24 "src": "<%= dirs.css.src %>/style-polymer.css",
25 "dest": "<%= dirs.js.dest %>/src/components/style-polymer.css"
25 "dest": "<%= dirs.js.dest %>/src/components/style-polymer.css"
26 }
26 }
27 ]
27 ]
28 }
28 }
29 },
29 },
30 "concat": {
30 "concat": {
31 "dist": {
31 "dist": {
32 "src": [
32 "src": [
33 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
33 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
34 "<%= dirs.js.node_modules %>/mousetrap/mousetrap.min.js",
34 "<%= dirs.js.node_modules %>/mousetrap/mousetrap.min.js",
35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
38 "<%= dirs.js.node_modules %>/dropzone/dist/dropzone.js",
38 "<%= dirs.js.node_modules %>/dropzone/dist/dropzone.js",
39 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
39 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
41 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
41 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
42 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
42 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
43 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
43 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
44 "<%= dirs.js.src %>/logging.js",
44 "<%= dirs.js.src %>/logging.js",
45 "<%= dirs.js.src %>/bootstrap.js",
45 "<%= dirs.js.src %>/bootstrap.js",
46 "<%= dirs.js.src %>/i18n_utils.js",
46 "<%= dirs.js.src %>/i18n_utils.js",
47 "<%= dirs.js.src %>/deform.js",
47 "<%= dirs.js.src %>/deform.js",
48 "<%= dirs.js.src %>/ejs.js",
48 "<%= dirs.js.src %>/ejs.js",
49 "<%= dirs.js.src %>/ejs_templates/utils.js",
49 "<%= dirs.js.src %>/ejs_templates/utils.js",
50 "<%= dirs.js.src %>/plugins/jquery.pjax.js",
50 "<%= dirs.js.src %>/plugins/jquery.pjax.js",
51 "<%= dirs.js.src %>/plugins/jquery.dataTables.js",
51 "<%= dirs.js.src %>/plugins/jquery.dataTables.js",
52 "<%= dirs.js.src %>/plugins/flavoured_checkbox.js",
52 "<%= dirs.js.src %>/plugins/flavoured_checkbox.js",
53 "<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js",
53 "<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js",
54 "<%= dirs.js.src %>/plugins/jquery.autocomplete.js",
54 "<%= dirs.js.src %>/plugins/jquery.autocomplete.js",
55 "<%= dirs.js.src %>/plugins/jquery.debounce.js",
55 "<%= dirs.js.src %>/plugins/jquery.debounce.js",
56 "<%= dirs.js.node_modules %>/mark.js/dist/jquery.mark.min.js",
56 "<%= dirs.js.node_modules %>/mark.js/dist/jquery.mark.min.js",
57 "<%= dirs.js.src %>/plugins/jquery.timeago.js",
57 "<%= dirs.js.src %>/plugins/jquery.timeago.js",
58 "<%= dirs.js.src %>/plugins/jquery.timeago-extension.js",
58 "<%= dirs.js.src %>/plugins/jquery.timeago-extension.js",
59 "<%= dirs.js.src %>/select2/select2.js",
59 "<%= dirs.js.src %>/select2/select2.js",
60 "<%= dirs.js.src %>/codemirror/codemirror.js",
60 "<%= dirs.js.src %>/codemirror/codemirror.js",
61 "<%= dirs.js.src %>/codemirror/codemirror_loadmode.js",
61 "<%= dirs.js.src %>/codemirror/codemirror_loadmode.js",
62 "<%= dirs.js.src %>/codemirror/codemirror_hint.js",
62 "<%= dirs.js.src %>/codemirror/codemirror_hint.js",
63 "<%= dirs.js.src %>/codemirror/codemirror_overlay.js",
63 "<%= dirs.js.src %>/codemirror/codemirror_overlay.js",
64 "<%= dirs.js.src %>/codemirror/codemirror_placeholder.js",
64 "<%= dirs.js.src %>/codemirror/codemirror_placeholder.js",
65 "<%= dirs.js.src %>/codemirror/codemirror_simplemode.js",
65 "<%= dirs.js.src %>/codemirror/codemirror_simplemode.js",
66 "<%= dirs.js.dest %>/mode/meta.js",
66 "<%= dirs.js.dest %>/mode/meta.js",
67 "<%= dirs.js.dest %>/mode/meta_ext.js",
67 "<%= dirs.js.dest %>/mode/meta_ext.js",
68 "<%= dirs.js.src_rc %>/i18n/select2/translations.js",
68 "<%= dirs.js.src_rc %>/i18n/select2/translations.js",
69 "<%= dirs.js.src %>/rhodecode/utils/array.js",
69 "<%= dirs.js.src %>/rhodecode/utils/array.js",
70 "<%= dirs.js.src %>/rhodecode/utils/string.js",
70 "<%= dirs.js.src %>/rhodecode/utils/string.js",
71 "<%= dirs.js.src %>/rhodecode/utils/pyroutes.js",
71 "<%= dirs.js.src %>/rhodecode/utils/pyroutes.js",
72 "<%= dirs.js.src %>/rhodecode/utils/ajax.js",
72 "<%= dirs.js.src %>/rhodecode/utils/ajax.js",
73 "<%= dirs.js.src %>/rhodecode/utils/autocomplete.js",
73 "<%= dirs.js.src %>/rhodecode/utils/autocomplete.js",
74 "<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js",
74 "<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js",
75 "<%= dirs.js.src %>/rhodecode/utils/ie.js",
75 "<%= dirs.js.src %>/rhodecode/utils/ie.js",
76 "<%= dirs.js.src %>/rhodecode/utils/os.js",
76 "<%= dirs.js.src %>/rhodecode/utils/os.js",
77 "<%= dirs.js.src %>/rhodecode/utils/topics.js",
77 "<%= dirs.js.src %>/rhodecode/utils/topics.js",
78 "<%= dirs.js.src %>/rhodecode/init.js",
78 "<%= dirs.js.src %>/rhodecode/init.js",
79 "<%= dirs.js.src %>/rhodecode/changelog.js",
79 "<%= dirs.js.src %>/rhodecode/changelog.js",
80 "<%= dirs.js.src %>/rhodecode/codemirror.js",
80 "<%= dirs.js.src %>/rhodecode/codemirror.js",
81 "<%= dirs.js.src %>/rhodecode/comments.js",
81 "<%= dirs.js.src %>/rhodecode/comments.js",
82 "<%= dirs.js.src %>/rhodecode/constants.js",
82 "<%= dirs.js.src %>/rhodecode/constants.js",
83 "<%= dirs.js.src %>/rhodecode/files.js",
83 "<%= dirs.js.src %>/rhodecode/files.js",
84 "<%= dirs.js.src %>/rhodecode/followers.js",
84 "<%= dirs.js.src %>/rhodecode/followers.js",
85 "<%= dirs.js.src %>/rhodecode/menus.js",
85 "<%= dirs.js.src %>/rhodecode/menus.js",
86 "<%= dirs.js.src %>/rhodecode/notifications.js",
86 "<%= dirs.js.src %>/rhodecode/notifications.js",
87 "<%= dirs.js.src %>/rhodecode/permissions.js",
87 "<%= dirs.js.src %>/rhodecode/permissions.js",
88 "<%= dirs.js.src %>/rhodecode/pjax.js",
88 "<%= dirs.js.src %>/rhodecode/pjax.js",
89 "<%= dirs.js.src %>/rhodecode/pullrequests.js",
89 "<%= dirs.js.src %>/rhodecode/pullrequests.js",
90 "<%= dirs.js.src %>/rhodecode/settings.js",
90 "<%= dirs.js.src %>/rhodecode/settings.js",
91 "<%= dirs.js.src %>/rhodecode/select2_widgets.js",
91 "<%= dirs.js.src %>/rhodecode/select2_widgets.js",
92 "<%= dirs.js.src %>/rhodecode/tooltips.js",
92 "<%= dirs.js.src %>/rhodecode/tooltips.js",
93 "<%= dirs.js.src %>/rhodecode/users.js",
93 "<%= dirs.js.src %>/rhodecode/users.js",
94 "<%= dirs.js.src %>/rhodecode/appenlight.js",
94 "<%= dirs.js.src %>/rhodecode/appenlight.js",
95 "<%= dirs.js.src %>/rhodecode.js",
95 "<%= dirs.js.src %>/rhodecode.js",
96 "<%= dirs.js.dest %>/rhodecode-components.js"
96 "<%= dirs.js.dest %>/rhodecode-components.js"
97 ],
97 ],
98 "dest": "<%= dirs.js.dest %>/scripts.js",
98 "dest": "<%= dirs.js.dest %>/scripts.js",
99 "nonull": true
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 "less": {
108 "less": {
103 "development": {
109 "development": {
104 "options": {
110 "options": {
105 "compress": false,
111 "compress": false,
106 "yuicompress": false,
112 "yuicompress": false,
107 "optimization": 0
113 "optimization": 0
108 },
114 },
109 "files": {
115 "files": {
110 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
116 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
111 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
117 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
112 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
118 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
113 }
119 }
114 },
120 },
115 "production": {
121 "production": {
116 "options": {
122 "options": {
117 "compress": true,
123 "compress": true,
118 "yuicompress": true,
124 "yuicompress": true,
119 "optimization": 2
125 "optimization": 2
120 },
126 },
121 "files": {
127 "files": {
122 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
128 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
123 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
129 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
124 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
130 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
125 }
131 }
126 },
132 },
127 "components": {
133 "components": {
128 "files": [
134 "files": [
129 {
135 {
130 "cwd": "<%= dirs.js.src %>/components/",
136 "cwd": "<%= dirs.js.src %>/components/",
131 "dest": "<%= dirs.js.src %>/components/",
137 "dest": "<%= dirs.js.src %>/components/",
132 "src": [
138 "src": [
133 "**/*.less"
139 "**/*.less"
134 ],
140 ],
135 "expand": true,
141 "expand": true,
136 "ext": ".css"
142 "ext": ".css"
137 }
143 }
138 ]
144 ]
139 }
145 }
140 },
146 },
141 "watch": {
147 "watch": {
142 "less": {
148 "less": {
143 "files": [
149 "files": [
144 "<%= dirs.css.src %>/**/*.less",
150 "<%= dirs.css.src %>/**/*.less",
145 "<%= dirs.js.src %>/components/**/*.less"
151 "<%= dirs.js.src %>/components/**/*.less"
146 ],
152 ],
147 "tasks": [
153 "tasks": [
148 "less:development",
154 "less:development",
149 "less:components",
155 "less:components",
150 "concat:polymercss",
156 "concat:polymercss",
151 "webpack",
157 "webpack",
152 "concat:dist"
158 "concat:dist"
153 ]
159 ]
154 },
160 },
155 "js": {
161 "js": {
156 "files": [
162 "files": [
157 "!<%= dirs.js.src %>/components/root-styles.gen.html",
163 "!<%= dirs.js.src %>/components/root-styles.gen.html",
158 "<%= dirs.js.src %>/**/*.js",
164 "<%= dirs.js.src %>/**/*.js",
159 "<%= dirs.js.src %>/components/**/*.html"
165 "<%= dirs.js.src %>/components/**/*.html"
160 ],
166 ],
161 "tasks": [
167 "tasks": [
162 "less:components",
168 "less:components",
163 "concat:polymercss",
169 "concat:polymercss",
164 "webpack",
170 "webpack",
165 "concat:dist"
171 "concat:dist"
166 ]
172 ]
167 }
173 }
168 },
174 },
169 "jshint": {
175 "jshint": {
170 "rhodecode": {
176 "rhodecode": {
171 "src": "<%= dirs.js.src %>/rhodecode/**/*.js",
177 "src": "<%= dirs.js.src %>/rhodecode/**/*.js",
172 "options": {
178 "options": {
173 "jshintrc": ".jshintrc"
179 "jshintrc": ".jshintrc"
174 }
180 }
175 }
181 }
176 }
182 }
177 }
183 }
@@ -1,60 +1,61 b''
1 {
1 {
2 "name": "rhodecode-enterprise",
2 "name": "rhodecode-enterprise",
3 "version": "2.0.0",
3 "version": "2.0.0",
4 "private": true,
4 "private": true,
5 "description" : "RhodeCode JS packaged",
5 "description" : "RhodeCode JS packaged",
6 "license": "SEE LICENSE IN LICENSE.txt",
6 "license": "SEE LICENSE IN LICENSE.txt",
7 "repository" : {
7 "repository" : {
8 "type" : "hg",
8 "type" : "hg",
9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 },
10 },
11 "devDependencies": {
11 "devDependencies": {
12 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1",
12 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1",
13 "clipboard": "^2.0.1",
13 "clipboard": "^2.0.1",
14 "exports-loader": "^0.6.4",
14 "exports-loader": "^0.6.4",
15 "favico.js": "^0.3.10",
15 "favico.js": "^0.3.10",
16 "dropzone": "^5.5.0",
16 "dropzone": "^5.5.0",
17 "grunt": "^0.4.5",
17 "grunt": "^0.4.5",
18 "grunt-cli": "^1.3.1",
18 "grunt-cli": "^1.3.1",
19 "grunt-contrib-concat": "^0.5.1",
19 "grunt-contrib-concat": "^0.5.1",
20 "grunt-contrib-copy": "^1.0.0",
20 "grunt-contrib-copy": "^1.0.0",
21 "grunt-contrib-jshint": "^0.12.0",
21 "grunt-contrib-jshint": "^0.12.0",
22 "grunt-contrib-less": "^1.1.0",
22 "grunt-contrib-less": "^1.1.0",
23 "grunt-contrib-watch": "^0.6.1",
23 "grunt-contrib-watch": "^0.6.1",
24 "grunt-webpack": "^3.1.3",
24 "grunt-webpack": "^3.1.3",
25 "grunt-contrib-uglify": "^4.0.1",
25 "jquery": "1.11.3",
26 "jquery": "1.11.3",
26 "mark.js": "8.11.1",
27 "mark.js": "8.11.1",
27 "jshint": "^2.9.1-rc3",
28 "jshint": "^2.9.1-rc3",
28 "moment": "^2.18.1",
29 "moment": "^2.18.1",
29 "mousetrap": "^1.6.1",
30 "mousetrap": "^1.6.1",
30 "qrious": "^4.0.2",
31 "qrious": "^4.0.2",
31 "sticky-sidebar": "3.3.1",
32 "sticky-sidebar": "3.3.1",
32 "waypoints": "4.0.1",
33 "waypoints": "4.0.1",
33 "webpack": "4.23.1",
34 "webpack": "4.23.1",
34 "webpack-cli": "3.1.2",
35 "webpack-cli": "3.1.2",
35 "babel-core": "^6.26.3",
36 "babel-core": "^6.26.3",
36 "babel-loader": "^7.1.2",
37 "babel-loader": "^7.1.2",
37 "babel-plugin-transform-object-rest-spread": "^6.26.0",
38 "babel-plugin-transform-object-rest-spread": "^6.26.0",
38 "babel-preset-env": "^1.6.0",
39 "babel-preset-env": "^1.6.0",
39 "copy-webpack-plugin": "^4.4.2",
40 "copy-webpack-plugin": "^4.4.2",
40 "css-loader": "^0.28.11",
41 "css-loader": "^0.28.11",
41 "html-loader": "^0.4.4",
42 "html-loader": "^0.4.4",
42 "html-webpack-plugin": "^3.2.0",
43 "html-webpack-plugin": "^3.2.0",
43 "imports-loader": "^0.7.1",
44 "imports-loader": "^0.7.1",
44 "polymer-webpack-loader": "^2.0.1",
45 "polymer-webpack-loader": "^2.0.1",
45 "style-loader": "^0.21.0",
46 "style-loader": "^0.21.0",
46 "webpack-uglify-js-plugin": "^1.1.9",
47 "webpack-uglify-js-plugin": "^1.1.9",
47 "raw-loader": "1.0.0-beta.0",
48 "raw-loader": "1.0.0-beta.0",
48 "ts-loader": "^1.3.3",
49 "ts-loader": "^1.3.3",
49 "@webcomponents/webcomponentsjs": "^2.0.0",
50 "@webcomponents/webcomponentsjs": "^2.0.0",
50 "@polymer/polymer": "^3.0.0",
51 "@polymer/polymer": "^3.0.0",
51 "@polymer/paper-button": "^3.0.0",
52 "@polymer/paper-button": "^3.0.0",
52 "@polymer/paper-spinner": "^3.0.0",
53 "@polymer/paper-spinner": "^3.0.0",
53 "@polymer/paper-tooltip": "^3.0.0",
54 "@polymer/paper-tooltip": "^3.0.0",
54 "@polymer/paper-toast": "^3.0.0",
55 "@polymer/paper-toast": "^3.0.0",
55 "@polymer/paper-toggle-button": "^3.0.0",
56 "@polymer/paper-toggle-button": "^3.0.0",
56 "@polymer/iron-ajax": "^3.0.0",
57 "@polymer/iron-ajax": "^3.0.0",
57 "@polymer/iron-autogrow-textarea": "^3.0.0",
58 "@polymer/iron-autogrow-textarea": "^3.0.0",
58 "@polymer/iron-a11y-keys": "^3.0.0"
59 "@polymer/iron-a11y-keys": "^3.0.0"
59 }
60 }
60 }
61 }
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/apps/file_store/local_store.py to rhodecode/apps/file_store/backends/local_store.py
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
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/templates/admin/gists/edit.mako to rhodecode/templates/admin/gists/gist_edit.mako
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
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
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
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
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now