##// END OF EJS Templates
merged default branch into stable
super-admin -
r5342:5c131067 merge stable
parent child Browse files
Show More

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

@@ -0,0 +1,95 b''
1 ; #####################
2 ; LOGGING CONFIGURATION
3 ; #####################
4
5 [loggers]
6 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
7
8 [handlers]
9 keys = console, console_sql
10
11 [formatters]
12 keys = generic, json, color_formatter, color_formatter_sql
13
14 ; #######
15 ; LOGGERS
16 ; #######
17 [logger_root]
18 level = NOTSET
19 handlers = console
20
21 [logger_sqlalchemy]
22 level = $RC_LOGGING_LEVEL
23 handlers = console_sql
24 qualname = sqlalchemy.engine
25 propagate = 0
26
27 [logger_beaker]
28 level = $RC_LOGGING_LEVEL
29 handlers =
30 qualname = beaker.container
31 propagate = 1
32
33 [logger_rhodecode]
34 level = $RC_LOGGING_LEVEL
35 handlers =
36 qualname = rhodecode
37 propagate = 1
38
39 [logger_ssh_wrapper]
40 level = $RC_LOGGING_LEVEL
41 handlers =
42 qualname = ssh_wrapper
43 propagate = 1
44
45 [logger_celery]
46 level = $RC_LOGGING_LEVEL
47 handlers =
48 qualname = celery
49
50
51 ; ########
52 ; HANDLERS
53 ; ########
54
55 [handler_console]
56 class = StreamHandler
57 args = (sys.stderr, )
58 level = $RC_LOGGING_LEVEL
59 ; To enable JSON formatted logs replace 'generic' with 'json'
60 ; This allows sending properly formatted logs to grafana loki or elasticsearch
61 formatter = $RC_LOGGING_FORMATTER
62
63 [handler_console_sql]
64 ; "level = DEBUG" logs SQL queries and results.
65 ; "level = INFO" logs SQL queries.
66 ; "level = WARN" logs neither. (Recommended for production systems.)
67 class = StreamHandler
68 args = (sys.stderr, )
69 level = WARN
70 ; To enable JSON formatted logs replace 'generic/color_formatter_sql' with 'json'
71 ; This allows sending properly formatted logs to grafana loki or elasticsearch
72 formatter = $RC_LOGGING_FORMATTER
73
74 ; ##########
75 ; FORMATTERS
76 ; ##########
77
78 [formatter_generic]
79 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
80 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
81 datefmt = %Y-%m-%d %H:%M:%S
82
83 [formatter_color_formatter]
84 class = rhodecode.lib.logging_formatter.ColorFormatter
85 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
86 datefmt = %Y-%m-%d %H:%M:%S
87
88 [formatter_color_formatter_sql]
89 class = rhodecode.lib.logging_formatter.ColorFormatterSql
90 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
91 datefmt = %Y-%m-%d %H:%M:%S
92
93 [formatter_json]
94 format = %(timestamp)s %(levelname)s %(name)s %(message)s %(req_id)s
95 class = rhodecode.lib._vendor.jsonlogger.JsonFormatter
@@ -0,0 +1,57 b''
1 # Copyright (C) 2010-2023 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 import pytest # noqa
20
21 # keep the imports to have a toplevel conftest.py but still importable from EE edition
22 from rhodecode.tests.conftest_common import ( # noqa
23 pytest_generate_tests,
24 pytest_runtest_makereport,
25 pytest_addoption
26 )
27
28
29 pytest_plugins = [
30 "rhodecode.tests.fixture_mods.fixture_pyramid",
31 "rhodecode.tests.fixture_mods.fixture_utils",
32 ]
33
34
35 def pytest_configure(config):
36 from rhodecode.config import patches # noqa
37
38
39 def pytest_collection_modifyitems(session, config, items):
40 # nottest marked, compare nose, used for transition from nose to pytest
41 remaining = [
42 i for i in items if getattr(i.obj, '__test__', True)]
43 items[:] = remaining
44
45 # NOTE(marcink): custom test ordering, db tests and vcstests are slowest and should
46 # be executed at the end for faster test feedback
47 def sorter(item):
48 pos = 0
49 key = item._nodeid
50 if key.startswith('rhodecode/tests/database'):
51 pos = 1
52 elif key.startswith('rhodecode/tests/vcs_operations'):
53 pos = 2
54
55 return pos
56
57 items.sort(key=sorter)
@@ -0,0 +1,24 b''
1 FROM python:3.12.0-bullseye
2
3 WORKDIR /project
4
5 RUN apt-get update \
6 && apt-get install --no-install-recommends --yes \
7 curl \
8 zip \
9 graphviz \
10 imagemagick \
11 make \
12 && apt-get autoremove \
13 && apt-get clean \
14 && rm -rf /var/lib/apt/lists/*
15
16 RUN \
17 python3 -m pip install --no-cache-dir --upgrade pip && \
18 python3 -m pip install --no-cache-dir Sphinx Pillow
19
20 ADD requirements_docs.txt /project
21 RUN \
22 python3 -m pip install -r requirements_docs.txt
23
24 CMD ["sphinx-build", "-M", "html", ".", "_build"]
@@ -0,0 +1,117 b''
1 <!doctype html>
2 <html class="no-js"{% if language is not none %} lang="{{ language }}"{% endif %} data-content_root="{{ content_root }}">
3 <head>
4 <!-- Google Tag Manager -->
5 <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
6 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
7 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
8 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
9 })(window,document,'script','dataLayer','GTM-M2TSG36B');</script>
10 <!-- End Google Tag Manager -->
11
12 {%- block site_meta -%}
13 <meta charset="utf-8"/>
14 <meta name="viewport" content="width=device-width,initial-scale=1"/>
15 <meta name="color-scheme" content="light dark">
16
17 {%- if metatags %}{{ metatags }}{% endif -%}
18
19 {%- block linktags %}
20 {%- if hasdoc('about') -%}
21 <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
22 {%- endif -%}
23 {%- if hasdoc('genindex') -%}
24 <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
25 {%- endif -%}
26 {%- if hasdoc('search') -%}
27 <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
28 {%- endif -%}
29 {%- if hasdoc('copyright') -%}
30 <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
31 {%- endif -%}
32 {%- if next -%}
33 <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
34 {%- endif -%}
35 {%- if prev -%}
36 <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
37 {%- endif -%}
38 {#- rel="canonical" (set by html_baseurl) -#}
39 {%- if pageurl %}
40 <link rel="canonical" href="{{ pageurl|e }}" />
41 {%- endif %}
42 {%- endblock linktags %}
43
44 {# Favicon #}
45 {%- if favicon_url -%}
46 <link rel="shortcut icon" href="{{ favicon_url }}"/>
47 {%- endif -%}
48
49 <!-- Generated with Sphinx {{ sphinx_version }} and Furo {{ furo_version }} -->
50
51 {%- endblock site_meta -%}
52
53 {#- Site title -#}
54 {%- block htmltitle -%}
55 {% if not docstitle %}
56 <title>{{ title|striptags|e }}</title>
57 {% elif pagename == master_doc %}
58 <title>{{ docstitle|striptags|e }}</title>
59 {% else %}
60 <title>{{ title|striptags|e }} - {{ docstitle|striptags|e }}</title>
61 {% endif %}
62 {%- endblock -%}
63
64 {%- block styles -%}
65
66 {# Custom stylesheets #}
67 {%- block regular_styles -%}
68 {%- for css in css_files -%}
69 {% if css|attr("filename") -%}
70 {{ css_tag(css) }}
71 {%- else -%}
72 <link rel="stylesheet" href="{{ pathto(css, 1)|e }}" type="text/css" />
73 {%- endif %}
74 {% endfor -%}
75 {%- endblock regular_styles -%}
76
77 {#- Theme-related stylesheets -#}
78 {%- block theme_styles %}
79 {% include "partials/_head_css_variables.html" with context %}
80 {%- endblock -%}
81
82 {%- block extra_styles %}
83 {%- endblock -%}
84
85 {%- endblock styles -%}
86
87 {#- Custom front matter #}
88 {%- block extrahead -%}{%- endblock -%}
89 </head>
90 <body>
91 <!-- Google Tag Manager (noscript) -->
92 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-M2TSG36B"
93 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
94 <!-- End Google Tag Manager (noscript) -->
95
96 {% block body %}
97 <script>
98 document.body.dataset.theme = localStorage.getItem("theme") || "auto";
99 </script>
100 {% endblock %}
101
102 {%- block scripts -%}
103
104 {# Custom JS #}
105 {%- block regular_scripts -%}
106 {% for path in script_files -%}
107 {{ js_tag(path) }}
108 {% endfor -%}
109 {%- endblock regular_scripts -%}
110
111 {# Theme-related JavaScript code #}
112 {%- block theme_scripts -%}
113 {%- endblock -%}
114
115 {%- endblock scripts -%}
116 </body>
117 </html> No newline at end of file
@@ -0,0 +1,204 b''
1 {% extends "base.html" %}
2
3 {% block body -%}
4 {{ super() }}
5 {% include "partials/icons.html" %}
6
7 <input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
8 <input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
9 <label class="overlay sidebar-overlay" for="__navigation">
10 <div class="visually-hidden">Hide navigation sidebar</div>
11 </label>
12 <label class="overlay toc-overlay" for="__toc">
13 <div class="visually-hidden">Hide table of contents sidebar</div>
14 </label>
15
16 {% if theme_announcement -%}
17 <div class="announcement">
18 <aside class="announcement-content">
19 {% block announcement %} {{ theme_announcement }} {% endblock announcement %}
20 </aside>
21 </div>
22 {%- endif %}
23
24 <div class="page">
25 <header class="mobile-header">
26 <div class="header-left">
27 <label class="nav-overlay-icon" for="__navigation">
28 <div class="visually-hidden">Toggle site navigation sidebar</div>
29 <i class="icon"><svg><use href="#svg-menu"></use></svg></i>
30 </label>
31 </div>
32 <div class="header-center">
33 <a href="{{ pathto(master_doc) }}"><div class="brand">{{ docstitle if docstitle else project }}</div></a>
34 </div>
35 <div class="header-right">
36 <div class="theme-toggle-container theme-toggle-header">
37 <button class="theme-toggle">
38 <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
39 <svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
40 <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
41 <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
42 </button>
43 </div>
44 <label class="toc-overlay-icon toc-header-icon{% if furo_hide_toc %} no-toc{% endif %}" for="__toc">
45 <div class="visually-hidden">Toggle table of contents sidebar</div>
46 <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
47 </label>
48 </div>
49 </header>
50 <aside class="sidebar-drawer">
51 <div class="sidebar-container">
52 {% block left_sidebar %}
53 <div class="sidebar-sticky">
54 {%- for sidebar_section in sidebars %}
55 {%- include sidebar_section %}
56 {%- endfor %}
57 </div>
58 {% endblock left_sidebar %}
59 </div>
60 </aside>
61 <div class="main">
62 <div class="content">
63 <div class="article-container">
64 <a href="#" class="back-to-top muted-link">
65 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
66 <path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
67 </svg>
68 <span>{% trans %}Back to top{% endtrans %}</span>
69 </a>
70 <div class="content-icon-container">
71 {% if theme_top_of_page_button == "edit" -%}
72 {%- include "components/edit-this-page.html" with context -%}
73 {%- elif theme_top_of_page_button != None -%}
74 {{ warning("Got an unsupported value for 'top_of_page_button'") }}
75 {%- endif -%}
76 {#- Theme toggle -#}
77 <div class="theme-toggle-container theme-toggle-content">
78 <button class="theme-toggle">
79 <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
80 <svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
81 <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
82 <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
83 </button>
84 </div>
85 <label class="toc-overlay-icon toc-content-icon{% if furo_hide_toc %} no-toc{% endif %}" for="__toc">
86 <div class="visually-hidden">Toggle table of contents sidebar</div>
87 <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
88 </label>
89 </div>
90 <article role="main">
91 {% block content %}{{ body }}{% endblock %}
92 </article>
93 </div>
94 <footer>
95 {% block footer %}
96 <div class="related-pages">
97 {% if next -%}
98 <a class="next-page" href="{{ next.link }}">
99 <div class="page-info">
100 <div class="context">
101 <span>{{ _("Next") }}</span>
102 </div>
103 <div class="title">{{ next.title }}</div>
104 </div>
105 <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
106 </a>
107 {%- endif %}
108 {% if prev -%}
109 <a class="prev-page" href="{{ prev.link }}">
110 <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
111 <div class="page-info">
112 <div class="context">
113 <span>{{ _("Previous") }}</span>
114 </div>
115 {% if prev.link == pathto(master_doc) %}
116 <div class="title">{{ _("Home") }}</div>
117 {% else %}
118 <div class="title">{{ prev.title }}</div>
119 {% endif %}
120 </div>
121 </a>
122 {%- endif %}
123 </div>
124 <div class="bottom-of-page">
125 <div class="left-details">
126 {%- if show_copyright %}
127 <div class="copyright">
128 {%- if hasdoc('copyright') %}
129 {% trans path=pathto('copyright'), copyright=copyright|e -%}
130 <a href="{{ path }}">Copyright</a> &#169; {{ copyright }}
131 {%- endtrans %}
132 {%- else %}
133 {% trans copyright=copyright|e -%}
134 Copyright &#169; {{ copyright }}
135 {%- endtrans %}
136 {%- endif %}
137 </div>
138 {%- endif %}
139
140 {%- if show_sphinx -%}
141 {% trans %}<a href="https://www.sphinx-doc.org/">Sphinx</a> and {% endtrans -%}
142 <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
143 {% endif -%}
144 {%- if last_updated -%}
145 <div class="last-updated">
146 {% trans last_updated=last_updated|e -%}
147 Last updated on {{ last_updated }}
148 {%- endtrans -%}
149 </div>
150
151 <div style="border-top: 0">
152 Got documentation defects and suggestions? <a href="https://community.rhodecode.com">Submit docs issues</a>
153 </div>
154
155 {%- endif %}
156 </div>
157 <div class="right-details">
158 {% if theme_footer_icons or READTHEDOCS -%}
159 <div class="icons">
160 {% if theme_footer_icons -%}
161 {% for icon_dict in theme_footer_icons -%}
162 <a class="muted-link {{ icon_dict.class }}" href="{{ icon_dict.url }}" aria-label="{{ icon_dict.name }}">
163 {{- icon_dict.html -}}
164 </a>
165 {% endfor %}
166 {%- else -%}
167 {#- Show Read the Docs project -#}
168 {%- if READTHEDOCS and slug -%}
169 <a class="muted-link" href="https://readthedocs.org/projects/{{ slug }}" aria-label="On Read the Docs">
170 <svg x="0px" y="0px" viewBox="-125 217 360 360" xml:space="preserve">
171 <path fill="currentColor" d="M39.2,391.3c-4.2,0.6-7.1,4.4-6.5,8.5c0.4,3,2.6,5.5,5.5,6.3 c0,0,18.5,6.1,50,8.7c25.3,2.1,54-1.8,54-1.8c4.2-0.1,7.5-3.6,7.4-7.8c-0.1-4.2-3.6-7.5-7.8-7.4c-0.5,0-1,0.1-1.5,0.2 c0,0-28.1,3.5-50.9,1.6c-30.1-2.4-46.5-7.9-46.5-7.9C41.7,391.3,40.4,391.1,39.2,391.3z M39.2,353.6c-4.2,0.6-7.1,4.4-6.5,8.5 c0.4,3,2.6,5.5,5.5,6.3c0,0,18.5,6.1,50,8.7c25.3,2.1,54-1.8,54-1.8c4.2-0.1,7.5-3.6,7.4-7.8c-0.1-4.2-3.6-7.5-7.8-7.4 c-0.5,0-1,0.1-1.5,0.2c0,0-28.1,3.5-50.9,1.6c-30.1-2.4-46.5-7.9-46.5-7.9C41.7,353.6,40.4,353.4,39.2,353.6z M39.2,315.9 c-4.2,0.6-7.1,4.4-6.5,8.5c0.4,3,2.6,5.5,5.5,6.3c0,0,18.5,6.1,50,8.7c25.3,2.1,54-1.8,54-1.8c4.2-0.1,7.5-3.6,7.4-7.8 c-0.1-4.2-3.6-7.5-7.8-7.4c-0.5,0-1,0.1-1.5,0.2c0,0-28.1,3.5-50.9,1.6c-30.1-2.4-46.5-7.9-46.5-7.9 C41.7,315.9,40.4,315.8,39.2,315.9z M39.2,278.3c-4.2,0.6-7.1,4.4-6.5,8.5c0.4,3,2.6,5.5,5.5,6.3c0,0,18.5,6.1,50,8.7 c25.3,2.1,54-1.8,54-1.8c4.2-0.1,7.5-3.6,7.4-7.8c-0.1-4.2-3.6-7.5-7.8-7.4c-0.5,0-1,0.1-1.5,0.2c0,0-28.1,3.5-50.9,1.6 c-30.1-2.4-46.5-7.9-46.5-7.9C41.7,278.2,40.4,278.1,39.2,278.3z M-13.6,238.5c-39.6,0.3-54.3,12.5-54.3,12.5v295.7 c0,0,14.4-12.4,60.8-10.5s55.9,18.2,112.9,19.3s71.3-8.8,71.3-8.8l0.8-301.4c0,0-25.6,7.3-75.6,7.7c-49.9,0.4-61.9-12.7-107.7-14.2 C-8.2,238.6-10.9,238.5-13.6,238.5z M19.5,257.8c0,0,24,7.9,68.3,10.1c37.5,1.9,75-3.7,75-3.7v267.9c0,0-19,10-66.5,6.6 C59.5,536.1,19,522.1,19,522.1L19.5,257.8z M-3.6,264.8c4.2,0,7.7,3.4,7.7,7.7c0,4.2-3.4,7.7-7.7,7.7c0,0-12.4,0.1-20,0.8 c-12.7,1.3-21.4,5.9-21.4,5.9c-3.7,2-8.4,0.5-10.3-3.2c-2-3.7-0.5-8.4,3.2-10.3c0,0,0,0,0,0c0,0,11.3-6,27-7.5 C-16,264.9-3.6,264.8-3.6,264.8z M-11,302.6c4.2-0.1,7.4,0,7.4,0c4.2,0.5,7.2,4.3,6.7,8.5c-0.4,3.5-3.2,6.3-6.7,6.7 c0,0-12.4,0.1-20,0.8c-12.7,1.3-21.4,5.9-21.4,5.9c-3.7,2-8.4,0.5-10.3-3.2c-2-3.7-0.5-8.4,3.2-10.3c0,0,11.3-6,27-7.5 C-20.5,302.9-15.2,302.7-11,302.6z M-3.6,340.2c4.2,0,7.7,3.4,7.7,7.7s-3.4,7.7-7.7,7.7c0,0-12.4-0.1-20,0.7 c-12.7,1.3-21.4,5.9-21.4,5.9c-3.7,2-8.4,0.5-10.3-3.2c-2-3.7-0.5-8.4,3.2-10.3c0,0,11.3-6,27-7.5C-16,340.1-3.6,340.2-3.6,340.2z" />
172 </svg>
173 </a>
174 {%- endif -%}
175 {%- endif %}
176 </div>
177 {%- endif %}
178 </div>
179 </div>
180 {% endblock footer %}
181 </footer>
182 </div>
183 <aside class="toc-drawer{% if furo_hide_toc %} no-toc{% endif %}">
184 {% block right_sidebar %}
185 {% if not furo_hide_toc %}
186 <div class="toc-sticky toc-scroll">
187 <div class="toc-title-container">
188 <span class="toc-title">
189 {{ _("On this page") }}
190 </span>
191 </div>
192 <div class="toc-tree-container">
193 <div class="toc-tree">
194 {{ toc }}
195 </div>
196 </div>
197 </div>
198 {% endif %}
199 {% endblock right_sidebar %}
200 </aside>
201 </div>
202 </div>
203
204 {%- endblock %}
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100755
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,10 +1,17 b''
1 1 {
2 2 "presets": [
3 ["env", {
4 "targets": {
5 "browsers": ["last 2 versions"]
3 [
4 "env",
5 {
6 "targets": {
7 "browsers": [
8 "last 2 versions"
9 ]
10 }
6 11 }
7 }]
12 ]
8 13 ],
9 "plugins": ["transform-object-rest-spread"]
14 "plugins": [
15 "transform-object-rest-spread"
16 ]
10 17 }
@@ -1,6 +1,5 b''
1 1 [bumpversion]
2 current_version = 4.27.1
2 current_version = 5.0.0
3 3 message = release: Bump version {current_version} to {new_version}
4 4
5 5 [bumpversion:file:rhodecode/VERSION]
6
@@ -1,68 +1,72 b''
1 1 syntax: glob
2
2 3 *.egg
3 4 *.egg-info
4 5 *.idea
5 6 *.orig
6 7 *.pyc
7 8 *.sqlite-journal
8 9 *.swp
9 10 *.tox
10 11 *.DS_Store*
11 12 rhodecode/public/js/src/components/**/*.css
12 13
13 14 syntax: regexp
14 15
15 16 #.filename
16 17 ^\.settings$
17 18 ^\.project$
18 19 ^\.pydevproject$
19 20 ^\.coverage$
20 21 ^\.cache.*$
22 ^\.ruff_cache.*$
21 23 ^\.rhodecode$
22 24
23 25 ^rcextensions
24 26 ^.dev
25 27 ^._dev
26 28 ^build/
27 29 ^coverage\.xml$
28 30 ^data$
29 31 ^\.eggs/
30 32 ^configs/data$
31 33 ^dev.ini$
32 34 ^acceptance_tests/dev.*\.ini$
33 35 ^dist/
34 36 ^fabfile.py
35 37 ^htmlcov
36 38 ^junit\.xml$
37 39 ^node_modules/
38 40 ^node_binaries/
41 ^package-lock.json
39 42 ^pylint.log$
40 43 ^rcextensions/
41 44 ^result$
42 45 ^rhodecode/public/css/style.css$
43 46 ^rhodecode/public/css/style-polymer.css$
44 47 ^rhodecode/public/css/style-ipython.css$
45 48 ^rhodecode/public/js/rhodecode-components.html$
46 49 ^rhodecode/public/js/rhodecode-components.js$
47 50 ^rhodecode/public/js/scripts.js$
48 51 ^rhodecode/public/js/scripts.min.js$
49 52 ^rhodecode/public/js/src/components/root-styles.gen.html$
50 53 ^rhodecode/public/js/vendors/webcomponentsjs/
51 54 ^rhodecode\.db$
52 55 ^rhodecode\.log$
53 56 ^rhodecode_dev\.log$
54 57 ^test\.db$
55 58
59
56 60 # ac-tests
57 61 ^acceptance_tests/\.cache.*$
58 62 ^acceptance_tests/externals
59 63 ^acceptance_tests/ghostdriver.log$
60 64 ^acceptance_tests/local(_.+)?\.ini$
61 65
62 66 # docs
63 67 ^docs/_build$
64 68 ^docs/result$
65 69 ^docs-internal/_build$
66 70
67 71 # Cythonized things
68 72 ^rhodecode/.*\.(c|so)$
@@ -1,52 +1,57 b''
1 1 # top level files
2
3 include MANIFEST.in
4 include README.rst
5 include CHANGES.rst
6 include LICENSE.txt
2 include *.rst
3 include *.txt
7 4
8 5 include rhodecode/VERSION
9 6
7 # all python files inside packages
8 graft rhodecode
9
10 10 # docs
11 11 recursive-include docs *
12 12
13 13 # all config files
14 14 recursive-include configs *
15 15
16 16 # translations
17 17 recursive-include rhodecode/i18n *
18 18
19 19 # non-python core stuff
20 20 recursive-include rhodecode *.cfg
21 21 recursive-include rhodecode *.json
22 22 recursive-include rhodecode *.ini_tmpl
23 23 recursive-include rhodecode *.sh
24 24 recursive-include rhodecode *.mako
25 25
26 26 # 502 page
27 27 include rhodecode/public/502.html
28 28
29 29 # robots
30 30 include rhodecode/public/robots.txt
31 31
32 32 # images, css
33 33 include rhodecode/public/css/*.css
34 34 include rhodecode/public/images/*.*
35 35 include rhodecode/public/images/ee_features/*.*
36 36
37 37 # sound files
38 38 include rhodecode/public/sounds/*.mp3
39 39 include rhodecode/public/sounds/*.wav
40 40
41 41 # fonts
42 42 recursive-include rhodecode/public/fonts/RCIcons *
43 43
44 44 # js
45 45 recursive-include rhodecode/public/js *
46 46
47 47 # templates
48 48 recursive-include rhodecode/templates *
49 49
50 50 # skip any tests files
51 recursive-exclude rhodecode/api/tests *
51 52 recursive-exclude rhodecode/tests *
52 53
54 recursive-exclude docs/_build *
55 recursive-exclude * __pycache__
56 recursive-exclude * *.py[co]
57 recursive-exclude * .*.sw[a-z]
@@ -1,98 +1,192 b''
1 .DEFAULT_GOAL := help
1 # required for pushd to work..
2 SHELL = /bin/bash
3
2 4
3 5 # set by: PATH_TO_OUTDATED_PACKAGES=/some/path/outdated_packages.py
4 6 OUTDATED_PACKAGES = ${PATH_TO_OUTDATED_PACKAGES}
5 7
6 NODE_PATH=./node_modules
7 WEBPACK=./node_binaries/webpack
8 GRUNT=./node_binaries/grunt
9
10 8 .PHONY: clean
11 clean: ## full clean
9 ## Cleanup compiled and cache py files
10 clean:
12 11 make test-clean
13 12 find . -type f \( -iname '*.c' -o -iname '*.pyc' -o -iname '*.so' -o -iname '*.orig' \) -exec rm '{}' ';'
13 find . -type d -name "build" -prune -exec rm -rf '{}' ';'
14 14
15 15
16 16 .PHONY: test
17 test: ## run test-clean and tests
17 ## run test-clean and tests
18 test:
18 19 make test-clean
19 20 make test-only
20 21
21 22
22 .PHONY:test-clean
23 test-clean: ## run test-clean and tests
23 .PHONY: test-clean
24 ## run test-clean and tests
25 test-clean:
24 26 rm -rf coverage.xml htmlcov junit.xml pylint.log result
25 27 find . -type d -name "__pycache__" -prune -exec rm -rf '{}' ';'
26 28 find . -type f \( -iname '.coverage.*' \) -exec rm '{}' ';'
27 29
28 30
29 31 .PHONY: test-only
30 test-only: ## run tests
32 ## Run tests only without cleanup
33 test-only:
31 34 PYTHONHASHSEED=random \
32 35 py.test -x -vv -r xw -p no:sugar \
33 --cov=rhodecode --cov-report=term-missing --cov-report=html \
34 rhodecode
36 --cov-report=term-missing --cov-report=html \
37 --cov=rhodecode rhodecode
35 38
36 39
37 40 .PHONY: test-only-mysql
38 test-only-mysql: ## run tests against mysql
41 ## run tests against mysql
42 test-only-mysql:
39 43 PYTHONHASHSEED=random \
40 44 py.test -x -vv -r xw -p no:sugar \
41 --cov=rhodecode --cov-report=term-missing --cov-report=html \
45 --cov-report=term-missing --cov-report=html \
42 46 --ini-config-override='{"app:main": {"sqlalchemy.db1.url": "mysql://root:qweqwe@localhost/rhodecode_test?charset=utf8"}}' \
43 rhodecode
47 --cov=rhodecode rhodecode
44 48
45 49
46 50 .PHONY: test-only-postgres
47 test-only-postgres: ## run tests against postgres
51 ## run tests against postgres
52 test-only-postgres:
48 53 PYTHONHASHSEED=random \
49 54 py.test -x -vv -r xw -p no:sugar \
50 --cov=rhodecode --cov-report=term-missing --cov-report=html \
55 --cov-report=term-missing --cov-report=html \
51 56 --ini-config-override='{"app:main": {"sqlalchemy.db1.url": "postgresql://postgres:qweqwe@localhost/rhodecode_test"}}' \
52 rhodecode
57 --cov=rhodecode rhodecode
58
59 .PHONY: ruff-check
60 ## run a ruff analysis
61 ruff-check:
62 ruff check --ignore F401 --ignore I001 --ignore E402 --ignore E501 --ignore F841 --exclude rhodecode/lib/dbmigrate --exclude .eggs --exclude .dev .
63
53 64
54 65 .PHONY: docs
55 docs: ## build docs
56 (cd docs; nix-build default.nix -o result; make clean html)
66 ## build docs
67 docs:
68 (cd docs; docker run --rm -v $(PWD):/project --workdir=/project/docs sphinx-doc-build-rc make clean html)
57 69
58 70
59 71 .PHONY: docs-clean
60 docs-clean: ## Cleanup docs
61 (cd docs; make clean)
72 ## Cleanup docs
73 docs-clean:
74 (cd docs; docker run --rm -v $(PWD):/project --workdir=/project/docs sphinx-doc-build-rc make clean)
62 75
63 76
64 77 .PHONY: docs-cleanup
65 docs-cleanup: ## Cleanup docs
66 (cd docs; make cleanup)
78 ## Cleanup docs
79 docs-cleanup:
80 (cd docs; docker run --rm -v $(PWD):/project --workdir=/project/docs sphinx-doc-build-rc make cleanup)
67 81
68 82
69 83 .PHONY: web-build
70 web-build: ## Build static/js
71 NODE_PATH=$(NODE_PATH) $(GRUNT)
72
73
74 .PHONY: generate-pkgs
75 generate-pkgs: ## generate new python packages
76 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
84 ## Build JS packages static/js
85 web-build:
86 docker run -it --rm -v $(PWD):/project --workdir=/project rhodecode/static-files-build:16 -c "npm install && /project/node_modules/.bin/grunt"
87 # run static file check
88 ./rhodecode/tests/scripts/static-file-check.sh rhodecode/public/
89 rm -rf node_modules
77 90
78 91
79 92 .PHONY: pip-packages
80 pip-packages: ## show outdated packages
93 ## Show outdated packages
94 pip-packages:
81 95 python ${OUTDATED_PACKAGES}
82 96
83 97
84 .PHONY: generate-js-pkgs
85 generate-js-pkgs: ## generate js packages
86 rm -rf node_modules && \
87 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" && \
88 sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix
98 .PHONY: build
99 ## Build sdist/egg
100 build:
101 python -m build
102
103
104 .PHONY: dev-sh
105 ## make dev-sh
106 dev-sh:
107 sudo echo "deb [trusted=yes] https://apt.fury.io/rsteube/ /" | sudo tee -a "/etc/apt/sources.list.d/fury.list"
108 sudo apt-get update
109 sudo apt-get install -y zsh carapace-bin
110 rm -rf /home/rhodecode/.oh-my-zsh
111 curl https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
112 echo "source <(carapace _carapace)" > /home/rhodecode/.zsrc
113 PROMPT='%(?.%F{green}√.%F{red}?%?)%f %B%F{240}%1~%f%b %# ' zsh
114
115
116 .PHONY: dev-cleanup
117 ## Cleanup: pip freeze | grep -v "^-e" | grep -v "@" | xargs pip uninstall -y
118 dev-cleanup:
119 pip freeze | grep -v "^-e" | grep -v "@" | xargs pip uninstall -y
120 rm -rf /tmp/*
121
122
123 .PHONY: dev-env
124 ## make dev-env based on the requirements files and install develop of packages
125 dev-env:
126 pip install build virtualenv
127 pushd ../rhodecode-vcsserver/ && make dev-env && popd
128 pip wheel --wheel-dir=/home/rhodecode/.cache/pip/wheels -r requirements.txt -r requirements_rc_tools.txt -r requirements_test.txt -r requirements_debug.txt
129 pip install --no-index --find-links=/home/rhodecode/.cache/pip/wheels -r requirements.txt -r requirements_rc_tools.txt -r requirements_test.txt -r requirements_debug.txt
130 pip install -e .
131
132
133 .PHONY: sh
134 ## shortcut for make dev-sh dev-env
135 sh:
136 make dev-env
137 make dev-sh
138
139
140 .PHONY: dev-srv
141 ## run develop server instance, docker exec -it $(docker ps -q --filter 'name=dev-enterprise-ce') /bin/bash
142 dev-srv:
143 pserve --reload .dev/dev.ini
89 144
90 145
91 .PHONY: generate-license-meta
92 generate-license-meta: ## Generate license metadata
93 nix-build pkgs/license-generate.nix -o result-license && \
94 cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json
146 .PHONY: dev-srv-g
147 ## run gunicorn multi process workers
148 dev-srv-g:
149 gunicorn --paste .dev/dev.ini --bind=0.0.0.0:10020 --config=.dev/gunicorn_config.py --timeout=120 --reload
150
151
152 # Default command on calling make
153 .DEFAULT_GOAL := show-help
95 154
96 .PHONY: help
97 help:
98 @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-24s\033[0m %s\n", $$1, $$2}'
155 .PHONY: show-help
156 show-help:
157 @echo "$$(tput bold)Available rules:$$(tput sgr0)"
158 @echo
159 @sed -n -e "/^## / { \
160 h; \
161 s/.*//; \
162 :doc" \
163 -e "H; \
164 n; \
165 s/^## //; \
166 t doc" \
167 -e "s/:.*//; \
168 G; \
169 s/\\n## /---/; \
170 s/\\n/ /g; \
171 p; \
172 }" ${MAKEFILE_LIST} \
173 | LC_ALL='C' sort --ignore-case \
174 | awk -F '---' \
175 -v ncol=$$(tput cols) \
176 -v indent=19 \
177 -v col_on="$$(tput setaf 6)" \
178 -v col_off="$$(tput sgr0)" \
179 '{ \
180 printf "%s%*s%s ", col_on, -indent, $$1, col_off; \
181 n = split($$2, words, " "); \
182 line_length = ncol - indent; \
183 for (i = 1; i <= n; i++) { \
184 line_length -= length(words[i]) + 1; \
185 if (line_length <= 0) { \
186 line_length = ncol - indent - length(words[i]) - 1; \
187 printf "\n%*s ", -indent, " "; \
188 } \
189 printf "%s ", words[i]; \
190 } \
191 printf "\n"; \
192 }'
@@ -1,845 +1,865 b''
1 ## -*- coding: utf-8 -*-
2 1
3 2 ; #########################################
4 3 ; RHODECODE COMMUNITY EDITION CONFIGURATION
5 4 ; #########################################
6 5
7 6 [DEFAULT]
8 7 ; Debug flag sets all loggers to debug, and enables request tracking
9 8 debug = true
10 9
11 10 ; ########################################################################
12 11 ; EMAIL CONFIGURATION
13 12 ; These settings will be used by the RhodeCode mailing system
14 13 ; ########################################################################
15 14
16 15 ; prefix all emails subjects with given prefix, helps filtering out emails
17 16 #email_prefix = [RhodeCode]
18 17
19 18 ; email FROM address all mails will be sent
20 19 #app_email_from = rhodecode-noreply@localhost
21 20
22 21 #smtp_server = mail.server.com
23 22 #smtp_username =
24 23 #smtp_password =
25 24 #smtp_port =
26 25 #smtp_use_tls = false
27 26 #smtp_use_ssl = true
28 27
29 28 [server:main]
30 ; COMMON HOST/IP CONFIG
29 ; COMMON HOST/IP CONFIG, This applies mostly to develop setup,
30 ; Host port for gunicorn are controlled by gunicorn_conf.py
31 31 host = 127.0.0.1
32 port = 5000
32 port = 10020
33 33
34 34 ; ##################################################
35 35 ; WAITRESS WSGI SERVER - Recommended for Development
36 36 ; ##################################################
37 37
38 38 ; use server type
39 39 use = egg:waitress#main
40 40
41 41 ; number of worker threads
42 42 threads = 5
43 43
44 44 ; MAX BODY SIZE 100GB
45 45 max_request_body_size = 107374182400
46 46
47 47 ; Use poll instead of select, fixes file descriptors limits problems.
48 48 ; May not work on old windows systems.
49 49 asyncore_use_poll = true
50 50
51 51
52 52 ; ###########################
53 53 ; GUNICORN APPLICATION SERVER
54 54 ; ###########################
55 55
56 ; run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
56 ; run with gunicorn --paste rhodecode.ini --config gunicorn_conf.py
57 57
58 58 ; Module to use, this setting shouldn't be changed
59 59 #use = egg:gunicorn#main
60 60
61 ; Sets the number of process workers. More workers means more concurrent connections
62 ; RhodeCode can handle at the same time. Each additional worker also it increases
63 ; memory usage as each has it's own set of caches.
64 ; Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
65 ; than 8-10 unless for really big deployments .e.g 700-1000 users.
66 ; `instance_id = *` must be set in the [app:main] section below (which is the default)
67 ; when using more than 1 worker.
68 #workers = 2
69
70 ; Gunicorn access log level
71 #loglevel = info
72
73 ; Process name visible in process list
74 #proc_name = rhodecode
75
76 ; Type of worker class, one of `sync`, `gevent`
77 ; Recommended type is `gevent`
78 #worker_class = gevent
79
80 ; The maximum number of simultaneous clients. Valid only for gevent
81 #worker_connections = 10
82
83 ; Max number of requests that worker will handle before being gracefully restarted.
84 ; Prevents memory leaks, jitter adds variability so not all workers are restarted at once.
85 #max_requests = 1000
86 #max_requests_jitter = 30
87
88 ; Amount of time a worker can spend with handling a request before it
89 ; gets killed and restarted. By default set to 21600 (6hrs)
90 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
91 #timeout = 21600
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
131
132 61 ; Prefix middleware for RhodeCode.
133 62 ; recommended when using proxy setup.
134 63 ; allows to set RhodeCode under a prefix in server.
135 64 ; eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
136 65 ; And set your prefix like: `prefix = /custom_prefix`
137 66 ; be sure to also set beaker.session.cookie_path = /custom_prefix if you need
138 67 ; to make your cookies only work on prefix url
139 68 [filter:proxy-prefix]
140 69 use = egg:PasteDeploy#prefix
141 70 prefix = /
142 71
143 72 [app:main]
144 73 ; The %(here)s variable will be replaced with the absolute path of parent directory
145 74 ; of this file
146 ; In addition ENVIRONMENT variables usage is possible, e.g
147 ; sqlalchemy.db1.url = {ENV_RC_DB_URL}
75 ; Each option in the app:main can be override by an environmental variable
76 ;
77 ;To override an option:
78 ;
79 ;RC_<KeyName>
80 ;Everything should be uppercase, . and - should be replaced by _.
81 ;For example, if you have these configuration settings:
82 ;rc_cache.repo_object.backend = foo
83 ;can be overridden by
84 ;export RC_CACHE_REPO_OBJECT_BACKEND=foo
148 85
149 86 use = egg:rhodecode-enterprise-ce
150 87
151 88 ; enable proxy prefix middleware, defined above
152 89 #filter-with = proxy-prefix
153 90
154 91 ; #############
155 92 ; DEBUG OPTIONS
156 93 ; #############
157 94
158 95 pyramid.reload_templates = true
159 96
160 97 # During development the we want to have the debug toolbar enabled
161 98 pyramid.includes =
162 99 pyramid_debugtoolbar
163 100
164 101 debugtoolbar.hosts = 0.0.0.0/0
165 102 debugtoolbar.exclude_prefixes =
166 103 /css
167 104 /fonts
168 105 /images
169 106 /js
170 107
171 108 ## RHODECODE PLUGINS ##
172 109 rhodecode.includes =
173 110 rhodecode.api
174 111
175 112
176 113 # api prefix url
177 114 rhodecode.api.url = /_admin/api
178 115
179 116 ; enable debug style page
180 117 debug_style = true
181 118
182 119 ; #################
183 120 ; END DEBUG OPTIONS
184 121 ; #################
185 122
186 123 ; encryption key used to encrypt social plugin tokens,
187 124 ; remote_urls with credentials etc, if not set it defaults to
188 125 ; `beaker.session.secret`
189 126 #rhodecode.encrypted_values.secret =
190 127
191 128 ; decryption strict mode (enabled by default). It controls if decryption raises
192 129 ; `SignatureVerificationError` in case of wrong key, or damaged encryption data.
193 130 #rhodecode.encrypted_values.strict = false
194 131
195 132 ; Pick algorithm for encryption. Either fernet (more secure) or aes (default)
196 133 ; fernet is safer, and we strongly recommend switching to it.
197 134 ; Due to backward compatibility aes is used as default.
198 135 #rhodecode.encrypted_values.algorithm = fernet
199 136
200 137 ; Return gzipped responses from RhodeCode (static files/application)
201 138 gzip_responses = false
202 139
203 140 ; Auto-generate javascript routes file on startup
204 141 generate_js_files = false
205 142
206 143 ; System global default language.
207 144 ; All available languages: en (default), be, de, es, fr, it, ja, pl, pt, ru, zh
208 145 lang = en
209 146
210 147 ; Perform a full repository scan and import on each server start.
211 148 ; Settings this to true could lead to very long startup time.
212 149 startup.import_repos = false
213 150
214 ; Uncomment and set this path to use archive download cache.
215 ; Once enabled, generated archives will be cached at this location
216 ; and served from the cache during subsequent requests for the same archive of
217 ; the repository.
218 #archive_cache_dir = /tmp/tarballcache
219
220 151 ; URL at which the application is running. This is used for Bootstrapping
221 152 ; requests in context when no web request is available. Used in ishell, or
222 153 ; SSH calls. Set this for events to receive proper url for SSH calls.
223 154 app.base_url = http://rhodecode.local
224 155
225 156 ; Unique application ID. Should be a random unique string for security.
226 157 app_instance_uuid = rc-production
227 158
228 159 ; Cut off limit for large diffs (size in bytes). If overall diff size on
229 160 ; commit, or pull request exceeds this limit this diff will be displayed
230 161 ; partially. E.g 512000 == 512Kb
231 162 cut_off_limit_diff = 512000
232 163
233 164 ; Cut off limit for large files inside diffs (size in bytes). Each individual
234 165 ; file inside diff which exceeds this limit will be displayed partially.
235 166 ; E.g 128000 == 128Kb
236 167 cut_off_limit_file = 128000
237 168
238 169 ; Use cached version of vcs repositories everywhere. Recommended to be `true`
239 170 vcs_full_cache = true
240 171
241 172 ; Force https in RhodeCode, fixes https redirects, assumes it's always https.
242 173 ; Normally this is controlled by proper flags sent from http server such as Nginx or Apache
243 174 force_https = false
244 175
245 176 ; use Strict-Transport-Security headers
246 177 use_htsts = false
247 178
248 179 ; Set to true if your repos are exposed using the dumb protocol
249 180 git_update_server_info = false
250 181
251 182 ; RSS/ATOM feed options
252 183 rss_cut_off_limit = 256000
253 184 rss_items_per_page = 10
254 185 rss_include_diff = false
255 186
256 187 ; gist URL alias, used to create nicer urls for gist. This should be an
257 188 ; url that does rewrites to _admin/gists/{gistid}.
258 189 ; example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
259 190 ; RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
260 191 gist_alias_url =
261 192
262 193 ; List of views (using glob pattern syntax) that AUTH TOKENS could be
263 194 ; used for access.
264 195 ; Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
265 196 ; came from the the logged in user who own this authentication token.
266 197 ; Additionally @TOKEN syntax can be used to bound the view to specific
267 198 ; authentication token. Such view would be only accessible when used together
268 199 ; with this authentication token
269 200 ; list of all views can be found under `/_admin/permissions/auth_token_access`
270 201 ; The list should be "," separated and on a single line.
271 202 ; Most common views to enable:
272 203
273 204 # RepoCommitsView:repo_commit_download
274 205 # RepoCommitsView:repo_commit_patch
275 206 # RepoCommitsView:repo_commit_raw
276 207 # RepoCommitsView:repo_commit_raw@TOKEN
277 208 # RepoFilesView:repo_files_diff
278 209 # RepoFilesView:repo_archivefile
279 210 # RepoFilesView:repo_file_raw
280 211 # GistView:*
281 212 api_access_controllers_whitelist =
282 213
283 214 ; Default encoding used to convert from and to unicode
284 215 ; can be also a comma separated list of encoding in case of mixed encodings
285 216 default_encoding = UTF-8
286 217
287 218 ; instance-id prefix
288 219 ; a prefix key for this instance used for cache invalidation when running
289 220 ; multiple instances of RhodeCode, make sure it's globally unique for
290 221 ; all running RhodeCode instances. Leave empty if you don't use it
291 222 instance_id =
292 223
293 224 ; Fallback authentication plugin. Set this to a plugin ID to force the usage
294 225 ; of an authentication plugin also if it is disabled by it's settings.
295 226 ; This could be useful if you are unable to log in to the system due to broken
296 227 ; authentication settings. Then you can enable e.g. the internal RhodeCode auth
297 228 ; module to log in again and fix the settings.
298 229 ; Available builtin plugin IDs (hash is part of the ID):
299 230 ; egg:rhodecode-enterprise-ce#rhodecode
300 231 ; egg:rhodecode-enterprise-ce#pam
301 232 ; egg:rhodecode-enterprise-ce#ldap
302 233 ; egg:rhodecode-enterprise-ce#jasig_cas
303 234 ; egg:rhodecode-enterprise-ce#headers
304 235 ; egg:rhodecode-enterprise-ce#crowd
305 236
306 237 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
307 238
308 239 ; Flag to control loading of legacy plugins in py:/path format
309 240 auth_plugin.import_legacy_plugins = true
310 241
311 242 ; alternative return HTTP header for failed authentication. Default HTTP
312 243 ; response is 401 HTTPUnauthorized. Currently HG clients have troubles with
313 244 ; handling that causing a series of failed authentication calls.
314 245 ; Set this variable to 403 to return HTTPForbidden, or any other HTTP code
315 246 ; This will be served instead of default 401 on bad authentication
316 247 auth_ret_code =
317 248
318 249 ; use special detection method when serving auth_ret_code, instead of serving
319 250 ; ret_code directly, use 401 initially (Which triggers credentials prompt)
320 251 ; and then serve auth_ret_code to clients
321 252 auth_ret_code_detection = false
322 253
323 254 ; locking return code. When repository is locked return this HTTP code. 2XX
324 255 ; codes don't break the transactions while 4XX codes do
325 256 lock_ret_code = 423
326 257
327 258 ; allows to change the repository location in settings page
328 259 allow_repo_location_change = true
329 260
330 261 ; allows to setup custom hooks in settings page
331 262 allow_custom_hooks_settings = true
332 263
333 264 ; Generated license token required for EE edition license.
334 265 ; New generated token value can be found in Admin > settings > license page.
335 266 license_token =
336 267
337 268 ; This flag hides sensitive information on the license page such as token, and license data
338 269 license.hide_license_info = false
339 270
340 271 ; supervisor connection uri, for managing supervisor and logs.
341 272 supervisor.uri =
342 273
343 274 ; supervisord group name/id we only want this RC instance to handle
344 275 supervisor.group_id = dev
345 276
346 277 ; Display extended labs settings
347 278 labs_settings_active = true
348 279
349 280 ; Custom exception store path, defaults to TMPDIR
350 281 ; This is used to store exception from RhodeCode in shared directory
351 282 #exception_tracker.store_path =
352 283
353 284 ; Send email with exception details when it happens
354 285 #exception_tracker.send_email = false
355 286
356 287 ; Comma separated list of recipients for exception emails,
357 288 ; e.g admin@rhodecode.com,devops@rhodecode.com
358 289 ; Can be left empty, then emails will be sent to ALL super-admins
359 290 #exception_tracker.send_email_recipients =
360 291
361 292 ; optional prefix to Add to email Subject
362 293 #exception_tracker.email_prefix = [RHODECODE ERROR]
363 294
364 295 ; File store configuration. This is used to store and serve uploaded files
365 296 file_store.enabled = true
366 297
367 298 ; Storage backend, available options are: local
368 299 file_store.backend = local
369 300
370 301 ; path to store the uploaded binaries
371 302 file_store.storage_path = %(here)s/data/file_store
372 303
304 ; Uncomment and set this path to control settings for archive download cache.
305 ; Generated repo archives will be cached at this location
306 ; and served from the cache during subsequent requests for the same archive of
307 ; the repository. This path is important to be shared across filesystems and with
308 ; RhodeCode and vcsserver
309
310 ; Default is $cache_dir/archive_cache if not set
311 archive_cache.store_dir = %(here)s/data/archive_cache
312
313 ; The limit in GB sets how much data we cache before recycling last used, defaults to 10 gb
314 archive_cache.cache_size_gb = 10
315
316 ; By default cache uses sharding technique, this specifies how many shards are there
317 archive_cache.cache_shards = 10
373 318
374 319 ; #############
375 320 ; CELERY CONFIG
376 321 ; #############
377 322
378 ; 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
323 ; manually run celery: /path/to/celery worker --task-events --beat --app rhodecode.lib.celerylib.loader --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler --loglevel DEBUG --ini /path/to/rhodecode.ini
379 324
380 325 use_celery = false
381 326
327 ; path to store schedule database
328 #celerybeat-schedule.path =
329
382 330 ; connection url to the message broker (default redis)
383 celery.broker_url = redis://localhost:6379/8
331 celery.broker_url = redis://redis:6379/8
332
333 ; results backend to get results for (default redis)
334 celery.result_backend = redis://redis:6379/8
384 335
385 336 ; rabbitmq example
386 337 #celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
387 338
388 339 ; maximum tasks to execute before worker restart
389 celery.max_tasks_per_child = 100
340 celery.max_tasks_per_child = 20
390 341
391 342 ; tasks will never be sent to the queue, but executed locally instead.
392 343 celery.task_always_eager = false
393 344
394 345 ; #############
395 346 ; DOGPILE CACHE
396 347 ; #############
397 348
398 349 ; Default cache dir for caches. Putting this into a ramdisk can boost performance.
399 350 ; eg. /tmpfs/data_ramdisk, however this directory might require large amount of space
400 351 cache_dir = %(here)s/data
401 352
402 353 ; *********************************************
403 354 ; `sql_cache_short` cache for heavy SQL queries
404 355 ; Only supported backend is `memory_lru`
405 356 ; *********************************************
406 357 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
407 358 rc_cache.sql_cache_short.expiration_time = 30
408 359
409 360
410 361 ; *****************************************************
411 362 ; `cache_repo_longterm` cache for repo object instances
412 363 ; Only supported backend is `memory_lru`
413 364 ; *****************************************************
414 365 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
415 366 ; by default we use 30 Days, cache is still invalidated on push
416 367 rc_cache.cache_repo_longterm.expiration_time = 2592000
417 368 ; max items in LRU cache, set to smaller number to save memory, and expire last used caches
418 369 rc_cache.cache_repo_longterm.max_size = 10000
419 370
420 371
372 ; *********************************************
373 ; `cache_general` cache for general purpose use
374 ; for simplicity use rc.file_namespace backend,
375 ; for performance and scale use rc.redis
376 ; *********************************************
377 rc_cache.cache_general.backend = dogpile.cache.rc.file_namespace
378 rc_cache.cache_general.expiration_time = 43200
379 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
380 #rc_cache.cache_general.arguments.filename = /tmp/cache_general_db
381
382 ; alternative `cache_general` redis backend with distributed lock
383 #rc_cache.cache_general.backend = dogpile.cache.rc.redis
384 #rc_cache.cache_general.expiration_time = 300
385
386 ; redis_expiration_time needs to be greater then expiration_time
387 #rc_cache.cache_general.arguments.redis_expiration_time = 7200
388
389 #rc_cache.cache_general.arguments.host = localhost
390 #rc_cache.cache_general.arguments.port = 6379
391 #rc_cache.cache_general.arguments.db = 0
392 #rc_cache.cache_general.arguments.socket_timeout = 30
393 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
394 #rc_cache.cache_general.arguments.distributed_lock = true
395
396 ; auto-renew lock to prevent stale locks, slower but safer. Use only if problems happen
397 #rc_cache.cache_general.arguments.lock_auto_renewal = true
398
421 399 ; *************************************************
422 400 ; `cache_perms` cache for permission tree, auth TTL
401 ; for simplicity use rc.file_namespace backend,
402 ; for performance and scale use rc.redis
423 403 ; *************************************************
424 404 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
425 rc_cache.cache_perms.expiration_time = 300
405 rc_cache.cache_perms.expiration_time = 3600
426 406 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
427 #rc_cache.cache_perms.arguments.filename = /tmp/cache_perms.db
407 #rc_cache.cache_perms.arguments.filename = /tmp/cache_perms_db
428 408
429 409 ; alternative `cache_perms` redis backend with distributed lock
430 410 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
431 411 #rc_cache.cache_perms.expiration_time = 300
432 412
433 413 ; redis_expiration_time needs to be greater then expiration_time
434 414 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
435 415
436 416 #rc_cache.cache_perms.arguments.host = localhost
437 417 #rc_cache.cache_perms.arguments.port = 6379
438 418 #rc_cache.cache_perms.arguments.db = 0
439 419 #rc_cache.cache_perms.arguments.socket_timeout = 30
440 420 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
441 421 #rc_cache.cache_perms.arguments.distributed_lock = true
442 422
423 ; auto-renew lock to prevent stale locks, slower but safer. Use only if problems happen
424 #rc_cache.cache_perms.arguments.lock_auto_renewal = true
443 425
444 426 ; ***************************************************
445 427 ; `cache_repo` cache for file tree, Readme, RSS FEEDS
428 ; for simplicity use rc.file_namespace backend,
429 ; for performance and scale use rc.redis
446 430 ; ***************************************************
447 431 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
448 432 rc_cache.cache_repo.expiration_time = 2592000
449 433 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
450 #rc_cache.cache_repo.arguments.filename = /tmp/cache_repo.db
434 #rc_cache.cache_repo.arguments.filename = /tmp/cache_repo_db
451 435
452 436 ; alternative `cache_repo` redis backend with distributed lock
453 437 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
454 438 #rc_cache.cache_repo.expiration_time = 2592000
455 439
456 440 ; redis_expiration_time needs to be greater then expiration_time
457 441 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
458 442
459 443 #rc_cache.cache_repo.arguments.host = localhost
460 444 #rc_cache.cache_repo.arguments.port = 6379
461 445 #rc_cache.cache_repo.arguments.db = 1
462 446 #rc_cache.cache_repo.arguments.socket_timeout = 30
463 447 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
464 448 #rc_cache.cache_repo.arguments.distributed_lock = true
465 449
450 ; auto-renew lock to prevent stale locks, slower but safer. Use only if problems happen
451 #rc_cache.cache_repo.arguments.lock_auto_renewal = true
466 452
467 453 ; ##############
468 454 ; BEAKER SESSION
469 455 ; ##############
470 456
471 457 ; beaker.session.type is type of storage options for the logged users sessions. Current allowed
472 ; types are file, ext:redis, ext:database, ext:memcached, and memory (default if not specified).
473 ; Fastest ones are Redis and ext:database
458 ; types are file, ext:redis, ext:database, ext:memcached
459 ; Fastest ones are ext:redis and ext:database, DO NOT use memory type for session
474 460 beaker.session.type = file
475 461 beaker.session.data_dir = %(here)s/data/sessions
476 462
477 463 ; Redis based sessions
478 464 #beaker.session.type = ext:redis
479 465 #beaker.session.url = redis://127.0.0.1:6379/2
480 466
481 467 ; DB based session, fast, and allows easy management over logged in users
482 468 #beaker.session.type = ext:database
483 469 #beaker.session.table_name = db_session
484 470 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
485 471 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
486 472 #beaker.session.sa.pool_recycle = 3600
487 473 #beaker.session.sa.echo = false
488 474
489 475 beaker.session.key = rhodecode
490 476 beaker.session.secret = develop-rc-uytcxaz
491 477 beaker.session.lock_dir = %(here)s/data/sessions/lock
492 478
493 479 ; Secure encrypted cookie. Requires AES and AES python libraries
494 480 ; you must disable beaker.session.secret to use this
495 481 #beaker.session.encrypt_key = key_for_encryption
496 482 #beaker.session.validate_key = validation_key
497 483
498 484 ; Sets session as invalid (also logging out user) if it haven not been
499 485 ; accessed for given amount of time in seconds
500 486 beaker.session.timeout = 2592000
501 487 beaker.session.httponly = true
502 488
503 489 ; Path to use for the cookie. Set to prefix if you use prefix middleware
504 490 #beaker.session.cookie_path = /custom_prefix
505 491
506 492 ; Set https secure cookie
507 493 beaker.session.secure = false
508 494
509 495 ; default cookie expiration time in seconds, set to `true` to set expire
510 496 ; at browser close
511 497 #beaker.session.cookie_expires = 3600
512 498
513 499 ; #############################
514 500 ; SEARCH INDEXING CONFIGURATION
515 501 ; #############################
516 502
517 503 ; Full text search indexer is available in rhodecode-tools under
518 504 ; `rhodecode-tools index` command
519 505
520 506 ; WHOOSH Backend, doesn't require additional services to run
521 507 ; it works good with few dozen repos
522 508 search.module = rhodecode.lib.index.whoosh
523 509 search.location = %(here)s/data/index
524 510
525 511 ; ####################
526 512 ; CHANNELSTREAM CONFIG
527 513 ; ####################
528 514
529 515 ; channelstream enables persistent connections and live notification
530 516 ; in the system. It's also used by the chat system
531 517
532 518 channelstream.enabled = false
533 519
534 520 ; server address for channelstream server on the backend
535 521 channelstream.server = 127.0.0.1:9800
536 522
537 523 ; location of the channelstream server from outside world
538 524 ; use ws:// for http or wss:// for https. This address needs to be handled
539 525 ; by external HTTP server such as Nginx or Apache
540 526 ; see Nginx/Apache configuration examples in our docs
541 527 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
542 528 channelstream.secret = secret
543 529 channelstream.history.location = %(here)s/channelstream_history
544 530
545 531 ; Internal application path that Javascript uses to connect into.
546 532 ; If you use proxy-prefix the prefix should be added before /_channelstream
547 533 channelstream.proxy_path = /_channelstream
548 534
549 535
550 536 ; ##############################
551 537 ; MAIN RHODECODE DATABASE CONFIG
552 538 ; ##############################
553 539
554 540 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
555 541 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
556 542 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
557 543 ; pymysql is an alternative driver for MySQL, use in case of problems with default one
558 544 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
559 545
560 546 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
561 547
562 548 ; see sqlalchemy docs for other advanced settings
563 549 ; print the sql statements to output
564 550 sqlalchemy.db1.echo = false
565 551
566 552 ; recycle the connections after this amount of seconds
567 553 sqlalchemy.db1.pool_recycle = 3600
568 sqlalchemy.db1.convert_unicode = true
569 554
570 555 ; the number of connections to keep open inside the connection pool.
571 556 ; 0 indicates no limit
557 ; the general calculus with gevent is:
558 ; if your system allows 500 concurrent greenlets (max_connections) that all do database access,
559 ; then increase pool size + max overflow so that they add up to 500.
572 560 #sqlalchemy.db1.pool_size = 5
573 561
574 562 ; The number of connections to allow in connection pool "overflow", that is
575 563 ; connections that can be opened above and beyond the pool_size setting,
576 564 ; which defaults to five.
577 565 #sqlalchemy.db1.max_overflow = 10
578 566
579 567 ; Connection check ping, used to detect broken database connections
580 568 ; could be enabled to better handle cases if MySQL has gone away errors
581 569 #sqlalchemy.db1.ping_connection = true
582 570
583 571 ; ##########
584 572 ; VCS CONFIG
585 573 ; ##########
586 574 vcs.server.enable = true
587 575 vcs.server = localhost:9900
588 576
589 577 ; Web server connectivity protocol, responsible for web based VCS operations
590 578 ; Available protocols are:
591 579 ; `http` - use http-rpc backend (default)
592 580 vcs.server.protocol = http
593 581
594 582 ; Push/Pull operations protocol, available options are:
595 583 ; `http` - use http-rpc backend (default)
596 584 vcs.scm_app_implementation = http
597 585
598 586 ; Push/Pull operations hooks protocol, available options are:
599 587 ; `http` - use http-rpc backend (default)
600 588 vcs.hooks.protocol = http
601 589
602 ; Host on which this instance is listening for hooks. If vcsserver is in other location
603 ; this should be adjusted.
604 vcs.hooks.host = 127.0.0.1
590 ; Host on which this instance is listening for hooks. vcsserver will call this host to pull/push hooks so it should be
591 ; accessible via network.
592 ; Use vcs.hooks.host = "*" to bind to current hostname (for Docker)
593 vcs.hooks.host = *
605 594
606 595 ; Start VCSServer with this instance as a subprocess, useful for development
607 596 vcs.start_server = false
608 597
609 598 ; List of enabled VCS backends, available options are:
610 599 ; `hg` - mercurial
611 600 ; `git` - git
612 601 ; `svn` - subversion
613 602 vcs.backends = hg, git, svn
614 603
615 604 ; Wait this number of seconds before killing connection to the vcsserver
616 605 vcs.connection_timeout = 3600
617 606
618 607 ; Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
619 608 ; Set a numeric version for your current SVN e.g 1.8, or 1.12
620 609 ; Legacy available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
621 610 #vcs.svn.compatible_version = 1.8
622 611
612 ; Cache flag to cache vcsserver remote calls locally
613 ; It uses cache_region `cache_repo`
614 vcs.methods.cache = true
623 615
624 616 ; ####################################################
625 617 ; Subversion proxy support (mod_dav_svn)
626 618 ; Maps RhodeCode repo groups into SVN paths for Apache
627 619 ; ####################################################
628 620
629 621 ; Enable or disable the config file generation.
630 622 svn.proxy.generate_config = false
631 623
632 624 ; Generate config file with `SVNListParentPath` set to `On`.
633 625 svn.proxy.list_parent_path = true
634 626
635 627 ; Set location and file name of generated config file.
636 628 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
637 629
638 630 ; alternative mod_dav config template. This needs to be a valid mako template
639 631 ; Example template can be found in the source code:
640 632 ; rhodecode/apps/svn_support/templates/mod-dav-svn.conf.mako
641 633 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
642 634
643 635 ; Used as a prefix to the `Location` block in the generated config file.
644 636 ; In most cases it should be set to `/`.
645 637 svn.proxy.location_root = /
646 638
647 639 ; Command to reload the mod dav svn configuration on change.
648 640 ; Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
649 641 ; Make sure user who runs RhodeCode process is allowed to reload Apache
650 642 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
651 643
652 644 ; If the timeout expires before the reload command finishes, the command will
653 645 ; be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
654 646 #svn.proxy.reload_timeout = 10
655 647
656 648 ; ####################
657 649 ; SSH Support Settings
658 650 ; ####################
659 651
660 652 ; Defines if a custom authorized_keys file should be created and written on
661 653 ; any change user ssh keys. Setting this to false also disables possibility
662 654 ; of adding SSH keys by users from web interface. Super admins can still
663 655 ; manage SSH Keys.
664 656 ssh.generate_authorized_keyfile = false
665 657
666 658 ; Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
667 659 # ssh.authorized_keys_ssh_opts =
668 660
669 661 ; Path to the authorized_keys file where the generate entries are placed.
670 662 ; It is possible to have multiple key files specified in `sshd_config` e.g.
671 663 ; AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
672 664 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
673 665
674 666 ; Command to execute the SSH wrapper. The binary is available in the
675 667 ; RhodeCode installation directory.
676 668 ; e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
677 669 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
678 670
679 671 ; Allow shell when executing the ssh-wrapper command
680 672 ssh.wrapper_cmd_allow_shell = false
681 673
682 674 ; Enables logging, and detailed output send back to the client during SSH
683 675 ; operations. Useful for debugging, shouldn't be used in production.
684 676 ssh.enable_debug_logging = true
685 677
686 678 ; Paths to binary executable, by default they are the names, but we can
687 679 ; override them if we want to use a custom one
688 680 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
689 681 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
690 682 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
691 683
692 684 ; Enables SSH key generator web interface. Disabling this still allows users
693 685 ; to add their own keys.
694 686 ssh.enable_ui_key_generator = true
695 687
696 688
697 689 ; #################
698 690 ; APPENLIGHT CONFIG
699 691 ; #################
700 692
701 693 ; Appenlight is tailored to work with RhodeCode, see
702 694 ; http://appenlight.rhodecode.com for details how to obtain an account
703 695
704 696 ; Appenlight integration enabled
705 appenlight = false
697 #appenlight = false
706 698
707 appenlight.server_url = https://api.appenlight.com
708 appenlight.api_key = YOUR_API_KEY
699 #appenlight.server_url = https://api.appenlight.com
700 #appenlight.api_key = YOUR_API_KEY
709 701 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
710 702
711 703 ; used for JS client
712 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
704 #appenlight.api_public_key = YOUR_API_PUBLIC_KEY
713 705
714 706 ; TWEAK AMOUNT OF INFO SENT HERE
715 707
716 708 ; enables 404 error logging (default False)
717 appenlight.report_404 = false
709 #appenlight.report_404 = false
718 710
719 711 ; time in seconds after request is considered being slow (default 1)
720 appenlight.slow_request_time = 1
712 #appenlight.slow_request_time = 1
721 713
722 714 ; record slow requests in application
723 715 ; (needs to be enabled for slow datastore recording and time tracking)
724 appenlight.slow_requests = true
716 #appenlight.slow_requests = true
725 717
726 718 ; enable hooking to application loggers
727 appenlight.logging = true
719 #appenlight.logging = true
728 720
729 721 ; minimum log level for log capture
730 appenlight.logging.level = WARNING
722 #ppenlight.logging.level = WARNING
731 723
732 724 ; send logs only from erroneous/slow requests
733 725 ; (saves API quota for intensive logging)
734 appenlight.logging_on_error = false
726 #appenlight.logging_on_error = false
735 727
736 728 ; list of additional keywords that should be grabbed from environ object
737 729 ; can be string with comma separated list of words in lowercase
738 730 ; (by default client will always send following info:
739 731 ; 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
740 732 ; start with HTTP* this list be extended with additional keywords here
741 appenlight.environ_keys_whitelist =
733 #appenlight.environ_keys_whitelist =
742 734
743 735 ; list of keywords that should be blanked from request object
744 736 ; can be string with comma separated list of words in lowercase
745 737 ; (by default client will always blank keys that contain following words
746 738 ; 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
747 739 ; this list be extended with additional keywords set here
748 appenlight.request_keys_blacklist =
740 #appenlight.request_keys_blacklist =
749 741
750 742 ; list of namespaces that should be ignores when gathering log entries
751 743 ; can be string with comma separated list of namespaces
752 744 ; (by default the client ignores own entries: appenlight_client.client)
753 appenlight.log_namespace_blacklist =
745 #appenlight.log_namespace_blacklist =
746
747 ; Statsd client config, this is used to send metrics to statsd
748 ; We recommend setting statsd_exported and scrape them using Prometheus
749 #statsd.enabled = false
750 #statsd.statsd_host = 0.0.0.0
751 #statsd.statsd_port = 8125
752 #statsd.statsd_prefix =
753 #statsd.statsd_ipv6 = false
754
755 ; configure logging automatically at server startup set to false
756 ; to use the below custom logging config.
757 ; RC_LOGGING_FORMATTER
758 ; RC_LOGGING_LEVEL
759 ; env variables can control the settings for logging in case of autoconfigure
760
761 #logging.autoconfigure = true
762
763 ; specify your own custom logging config file to configure logging
764 #logging.logging_conf_file = /path/to/custom_logging.ini
754 765
755 766 ; Dummy marker to add new entries after.
756 767 ; Add any custom entries below. Please don't remove this marker.
757 768 custom.conf = 1
758 769
759 770
760 771 ; #####################
761 772 ; LOGGING CONFIGURATION
762 773 ; #####################
774
763 775 [loggers]
764 776 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
765 777
766 778 [handlers]
767 779 keys = console, console_sql
768 780
769 781 [formatters]
770 keys = generic, color_formatter, color_formatter_sql
782 keys = generic, json, color_formatter, color_formatter_sql
771 783
772 784 ; #######
773 785 ; LOGGERS
774 786 ; #######
775 787 [logger_root]
776 788 level = NOTSET
777 789 handlers = console
778 790
779 791 [logger_sqlalchemy]
780 792 level = INFO
781 793 handlers = console_sql
782 794 qualname = sqlalchemy.engine
783 795 propagate = 0
784 796
785 797 [logger_beaker]
786 798 level = DEBUG
787 799 handlers =
788 800 qualname = beaker.container
789 801 propagate = 1
790 802
791 803 [logger_rhodecode]
792 804 level = DEBUG
793 805 handlers =
794 806 qualname = rhodecode
795 807 propagate = 1
796 808
797 809 [logger_ssh_wrapper]
798 810 level = DEBUG
799 811 handlers =
800 812 qualname = ssh_wrapper
801 813 propagate = 1
802 814
803 815 [logger_celery]
804 816 level = DEBUG
805 817 handlers =
806 818 qualname = celery
807 819
808 820
809 821 ; ########
810 822 ; HANDLERS
811 823 ; ########
812 824
813 825 [handler_console]
814 826 class = StreamHandler
815 827 args = (sys.stderr, )
816 828 level = DEBUG
829 ; To enable JSON formatted logs replace 'generic/color_formatter' with 'json'
830 ; This allows sending properly formatted logs to grafana loki or elasticsearch
817 831 formatter = color_formatter
818 832
819 833 [handler_console_sql]
820 834 ; "level = DEBUG" logs SQL queries and results.
821 835 ; "level = INFO" logs SQL queries.
822 836 ; "level = WARN" logs neither. (Recommended for production systems.)
823 837 class = StreamHandler
824 838 args = (sys.stderr, )
825 839 level = WARN
840 ; To enable JSON formatted logs replace 'generic/color_formatter_sql' with 'json'
841 ; This allows sending properly formatted logs to grafana loki or elasticsearch
826 842 formatter = color_formatter_sql
827 843
828 844 ; ##########
829 845 ; FORMATTERS
830 846 ; ##########
831 847
832 848 [formatter_generic]
833 849 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
834 850 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
835 851 datefmt = %Y-%m-%d %H:%M:%S
836 852
837 853 [formatter_color_formatter]
838 854 class = rhodecode.lib.logging_formatter.ColorFormatter
839 855 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
840 856 datefmt = %Y-%m-%d %H:%M:%S
841 857
842 858 [formatter_color_formatter_sql]
843 859 class = rhodecode.lib.logging_formatter.ColorFormatterSql
844 860 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
845 861 datefmt = %Y-%m-%d %H:%M:%S
862
863 [formatter_json]
864 format = %(timestamp)s %(levelname)s %(name)s %(message)s %(req_id)s
865 class = rhodecode.lib._vendor.jsonlogger.JsonFormatter
@@ -1,265 +1,520 b''
1 1 """
2 2 Gunicorn config extension and hooks. This config file adds some extra settings and memory management.
3 3 Gunicorn configuration should be managed by .ini files entries of RhodeCode or VCSServer
4 4 """
5 5
6 6 import gc
7 7 import os
8 8 import sys
9 9 import math
10 10 import time
11 11 import threading
12 12 import traceback
13 13 import random
14 import socket
15 import dataclasses
14 16 from gunicorn.glogging import Logger
15 17
16 18
17 19 def get_workers():
18 20 import multiprocessing
19 21 return multiprocessing.cpu_count() * 2 + 1
20 22
21 # GLOBAL
23
24 bind = "127.0.0.1:10020"
25
26
27 # Error logging output for gunicorn (-) is stdout
22 28 errorlog = '-'
29
30 # Access logging output for gunicorn (-) is stdout
23 31 accesslog = '-'
24 32
25 33
26 34 # SERVER MECHANICS
27 35 # None == system temp dir
28 36 # worker_tmp_dir is recommended to be set to some tmpfs
29 37 worker_tmp_dir = None
30 38 tmp_upload_dir = None
31 39
40 # use re-use port logic
41 #reuse_port = True
42
32 43 # Custom log format
44 #access_log_format = (
45 # '%(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"')
46
47 # loki format for easier parsing in grafana
33 48 access_log_format = (
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"')
49 'time="%(t)s" pid=%(p)s level="INFO" type="[GNCRN]" ip="%(h)-15s" rqt="%(L)s" response_code="%(s)s" response_bytes="%(b)-6s" uri="%(m)s:%(U)s %(q)s" user=":%(u)s" user_agent="%(a)s"')
50
51 # self adjust workers based on CPU count, to use maximum of CPU and not overquota the resources
52 # workers = get_workers()
53
54 # Gunicorn access log level
55 loglevel = 'info'
56
57 # Process name visible in a process list
58 proc_name = 'rhodecode_enterprise'
59
60 # Type of worker class, one of `sync`, `gevent` or `gthread`
61 # currently `sync` is the only option allowed for vcsserver and for rhodecode all of 3 are allowed
62 # gevent:
63 # In this case, the maximum number of concurrent requests is (N workers * X worker_connections)
64 # e.g. workers =3 worker_connections=10 = 3*10, 30 concurrent requests can be handled
65 # gthread:
66 # In this case, the maximum number of concurrent requests is (N workers * X threads)
67 # e.g. workers = 3 threads=3 = 3*3, 9 concurrent requests can be handled
68 worker_class = 'gthread'
69
70 # Sets the number of process workers. More workers means more concurrent connections
71 # RhodeCode can handle at the same time. Each additional worker also it increases
72 # memory usage as each has its own set of caches.
73 # The Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
74 # than 8-10 unless for huge deployments .e.g 700-1000 users.
75 # `instance_id = *` must be set in the [app:main] section below (which is the default)
76 # when using more than 1 worker.
77 workers = 2
78
79 # Threads numbers for worker class gthread
80 threads = 1
81
82 # The maximum number of simultaneous clients. Valid only for gevent
83 # In this case, the maximum number of concurrent requests is (N workers * X worker_connections)
84 # e.g workers =3 worker_connections=10 = 3*10, 30 concurrent requests can be handled
85 worker_connections = 10
86
87 # Max number of requests that worker will handle before being gracefully restarted.
88 # Prevents memory leaks, jitter adds variability so not all workers are restarted at once.
89 max_requests = 2000
90 max_requests_jitter = int(max_requests * 0.2) # 20% of max_requests
91
92 # The maximum number of pending connections.
93 # Exceeding this number results in the client getting an error when attempting to connect.
94 backlog = 64
35 95
36 # self adjust workers based on CPU count
37 # workers = get_workers()
96 # The Amount of time a worker can spend with handling a request before it
97 # gets killed and restarted. By default, set to 21600 (6hrs)
98 # Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
99 timeout = 21600
100
101 # The maximum size of HTTP request line in bytes.
102 # 0 for unlimited
103 limit_request_line = 0
104
105 # Limit the number of HTTP headers fields in a request.
106 # By default this value is 100 and can't be larger than 32768.
107 limit_request_fields = 32768
108
109 # Limit the allowed size of an HTTP request header field.
110 # Value is a positive number or 0.
111 # Setting it to 0 will allow unlimited header field sizes.
112 limit_request_field_size = 0
113
114 # Timeout for graceful workers restart.
115 # After receiving a restart signal, workers have this much time to finish
116 # serving requests. Workers still alive after the timeout (starting from the
117 # receipt of the restart signal) are force killed.
118 # Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
119 graceful_timeout = 21600
120
121 # The number of seconds to wait for requests on a Keep-Alive connection.
122 # Generally set in the 1-5 seconds range.
123 keepalive = 2
124
125 # Maximum memory usage that each worker can use before it will receive a
126 # graceful restart signal 0 = memory monitoring is disabled
127 # Examples: 268435456 (256MB), 536870912 (512MB)
128 # 1073741824 (1GB), 2147483648 (2GB), 4294967296 (4GB)
129 # Dynamic formula 1024 * 1024 * 256 == 256MBs
130 memory_max_usage = 0
131
132 # How often in seconds to check for memory usage for each gunicorn worker
133 memory_usage_check_interval = 60
134
135 # Threshold value for which we don't recycle worker if GarbageCollection
136 # frees up enough resources. Before each restart, we try to run GC on worker
137 # in case we get enough free memory after that; restart will not happen.
138 memory_usage_recovery_threshold = 0.8
139
140
141 @dataclasses.dataclass
142 class MemoryCheckConfig:
143 max_usage: int
144 check_interval: int
145 recovery_threshold: float
38 146
39 147
40 148 def _get_process_rss(pid=None):
41 149 try:
42 150 import psutil
43 151 if pid:
44 152 proc = psutil.Process(pid)
45 153 else:
46 154 proc = psutil.Process()
47 155 return proc.memory_info().rss
48 156 except Exception:
49 157 return None
50 158
51 159
52 160 def _get_config(ini_path):
161 import configparser
53 162
54 163 try:
55 import configparser
56 except ImportError:
57 import ConfigParser as configparser
58 try:
59 164 config = configparser.RawConfigParser()
60 165 config.read(ini_path)
61 166 return config
62 167 except Exception:
63 168 return None
64 169
65 170
66 def _time_with_offset(memory_usage_check_interval):
67 return time.time() - random.randint(0, memory_usage_check_interval/2.0)
171 def get_memory_usage_params(config=None):
172 # memory spec defaults
173 _memory_max_usage = memory_max_usage
174 _memory_usage_check_interval = memory_usage_check_interval
175 _memory_usage_recovery_threshold = memory_usage_recovery_threshold
176
177 if config:
178 ini_path = os.path.abspath(config)
179 conf = _get_config(ini_path)
180
181 section = 'server:main'
182 if conf and conf.has_section(section):
183
184 if conf.has_option(section, 'memory_max_usage'):
185 _memory_max_usage = conf.getint(section, 'memory_max_usage')
186
187 if conf.has_option(section, 'memory_usage_check_interval'):
188 _memory_usage_check_interval = conf.getint(section, 'memory_usage_check_interval')
189
190 if conf.has_option(section, 'memory_usage_recovery_threshold'):
191 _memory_usage_recovery_threshold = conf.getfloat(section, 'memory_usage_recovery_threshold')
192
193 _memory_max_usage = int(os.environ.get('RC_GUNICORN_MEMORY_MAX_USAGE', '')
194 or _memory_max_usage)
195 _memory_usage_check_interval = int(os.environ.get('RC_GUNICORN_MEMORY_USAGE_CHECK_INTERVAL', '')
196 or _memory_usage_check_interval)
197 _memory_usage_recovery_threshold = float(os.environ.get('RC_GUNICORN_MEMORY_USAGE_RECOVERY_THRESHOLD', '')
198 or _memory_usage_recovery_threshold)
199
200 return MemoryCheckConfig(_memory_max_usage, _memory_usage_check_interval, _memory_usage_recovery_threshold)
201
202
203 def _time_with_offset(check_interval):
204 return time.time() - random.randint(0, check_interval/2.0)
68 205
69 206
70 207 def pre_fork(server, worker):
71 208 pass
72 209
73 210
74 211 def post_fork(server, worker):
75 212
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):
213 memory_conf = get_memory_usage_params()
214 _memory_max_usage = memory_conf.max_usage
215 _memory_usage_check_interval = memory_conf.check_interval
216 _memory_usage_recovery_threshold = memory_conf.recovery_threshold
86 217
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
218 worker._memory_max_usage = int(os.environ.get('RC_GUNICORN_MEMORY_MAX_USAGE', '')
219 or _memory_max_usage)
220 worker._memory_usage_check_interval = int(os.environ.get('RC_GUNICORN_MEMORY_USAGE_CHECK_INTERVAL', '')
221 or _memory_usage_check_interval)
222 worker._memory_usage_recovery_threshold = float(os.environ.get('RC_GUNICORN_MEMORY_USAGE_RECOVERY_THRESHOLD', '')
223 or _memory_usage_recovery_threshold)
99 224
100 225 # register memory last check time, with some random offset so we don't recycle all
101 226 # at once
102 227 worker._last_memory_check_time = _time_with_offset(_memory_usage_check_interval)
103 228
104 229 if _memory_max_usage:
105 server.log.info("[%-10s] WORKER spawned with max memory set at %s", worker.pid,
230 server.log.info("pid=[%-10s] WORKER spawned with max memory set at %s", worker.pid,
106 231 _format_data_size(_memory_max_usage))
107 232 else:
108 server.log.info("[%-10s] WORKER spawned", worker.pid)
233 server.log.info("pid=[%-10s] WORKER spawned", worker.pid)
109 234
110 235
111 236 def pre_exec(server):
112 237 server.log.info("Forked child, re-executing.")
113 238
114 239
115 240 def on_starting(server):
116 241 server_lbl = '{} {}'.format(server.proc_name, server.address)
117 242 server.log.info("Server %s is starting.", server_lbl)
243 server.log.info('Config:')
244 server.log.info(f"\n{server.cfg}")
245 server.log.info(get_memory_usage_params())
118 246
119 247
120 248 def when_ready(server):
121 249 server.log.info("Server %s is ready. Spawning workers", server)
122 250
123 251
124 252 def on_reload(server):
125 253 pass
126 254
127 255
128 256 def _format_data_size(size, unit="B", precision=1, binary=True):
129 257 """Format a number using SI units (kilo, mega, etc.).
130 258
131 259 ``size``: The number as a float or int.
132 260
133 261 ``unit``: The unit name in plural form. Examples: "bytes", "B".
134 262
135 263 ``precision``: How many digits to the right of the decimal point. Default
136 264 is 1. 0 suppresses the decimal point.
137 265
138 266 ``binary``: If false, use base-10 decimal prefixes (kilo = K = 1000).
139 267 If true, use base-2 binary prefixes (kibi = Ki = 1024).
140 268
141 269 ``full_name``: If false (default), use the prefix abbreviation ("k" or
142 270 "Ki"). If true, use the full prefix ("kilo" or "kibi"). If false,
143 271 use abbreviation ("k" or "Ki").
144 272
145 273 """
146 274
147 275 if not binary:
148 276 base = 1000
149 277 multiples = ('', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
150 278 else:
151 279 base = 1024
152 280 multiples = ('', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi')
153 281
154 282 sign = ""
155 283 if size > 0:
156 284 m = int(math.log(size, base))
157 285 elif size < 0:
158 286 sign = "-"
159 287 size = -size
160 288 m = int(math.log(size, base))
161 289 else:
162 290 m = 0
163 291 if m > 8:
164 292 m = 8
165 293
166 294 if m == 0:
167 295 precision = '%.0f'
168 296 else:
169 297 precision = '%%.%df' % precision
170 298
171 299 size = precision % (size / math.pow(base, m))
172 300
173 301 return '%s%s %s%s' % (sign, size.strip(), multiples[m], unit)
174 302
175 303
176 304 def _check_memory_usage(worker):
177 memory_max_usage = worker._memory_max_usage
178 if not memory_max_usage:
305 _memory_max_usage = worker._memory_max_usage
306 if not _memory_max_usage:
179 307 return
180 308
181 memory_usage_check_interval = worker._memory_usage_check_interval
182 memory_usage_recovery_threshold = memory_max_usage * worker._memory_usage_recovery_threshold
309 _memory_usage_check_interval = worker._memory_usage_check_interval
310 _memory_usage_recovery_threshold = memory_max_usage * worker._memory_usage_recovery_threshold
183 311
184 312 elapsed = time.time() - worker._last_memory_check_time
185 if elapsed > memory_usage_check_interval:
313 if elapsed > _memory_usage_check_interval:
186 314 mem_usage = _get_process_rss()
187 if mem_usage and mem_usage > memory_max_usage:
315 if mem_usage and mem_usage > _memory_max_usage:
188 316 worker.log.info(
189 317 "memory usage %s > %s, forcing gc",
190 _format_data_size(mem_usage), _format_data_size(memory_max_usage))
318 _format_data_size(mem_usage), _format_data_size(_memory_max_usage))
191 319 # Try to clean it up by forcing a full collection.
192 320 gc.collect()
193 321 mem_usage = _get_process_rss()
194 if mem_usage > memory_usage_recovery_threshold:
322 if mem_usage > _memory_usage_recovery_threshold:
195 323 # Didn't clean up enough, we'll have to terminate.
196 324 worker.log.warning(
197 325 "memory usage %s > %s after gc, quitting",
198 _format_data_size(mem_usage), _format_data_size(memory_max_usage))
326 _format_data_size(mem_usage), _format_data_size(_memory_max_usage))
199 327 # This will cause worker to auto-restart itself
200 328 worker.alive = False
201 329 worker._last_memory_check_time = time.time()
202 330
203 331
204 332 def worker_int(worker):
205 worker.log.info("[%-10s] worker received INT or QUIT signal", worker.pid)
333 worker.log.info("pid=[%-10s] worker received INT or QUIT signal", worker.pid)
206 334
207 # get traceback info, on worker crash
208 id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
335 # get traceback info, when a worker crashes
336 def get_thread_id(t_id):
337 id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
338 return id2name.get(t_id, "unknown_thread_id")
339
209 340 code = []
210 for thread_id, stack in sys._current_frames().items():
341 for thread_id, stack in sys._current_frames().items(): # noqa
211 342 code.append(
212 "\n# Thread: %s(%d)" % (id2name.get(thread_id, ""), thread_id))
343 "\n# Thread: %s(%d)" % (get_thread_id(thread_id), thread_id))
213 344 for fname, lineno, name, line in traceback.extract_stack(stack):
214 345 code.append('File: "%s", line %d, in %s' % (fname, lineno, name))
215 346 if line:
216 347 code.append(" %s" % (line.strip()))
217 348 worker.log.debug("\n".join(code))
218 349
219 350
220 351 def worker_abort(worker):
221 worker.log.info("[%-10s] worker received SIGABRT signal", worker.pid)
352 worker.log.info("pid=[%-10s] worker received SIGABRT signal", worker.pid)
222 353
223 354
224 355 def worker_exit(server, worker):
225 worker.log.info("[%-10s] worker exit", worker.pid)
356 worker.log.info("pid=[%-10s] worker exit", worker.pid)
226 357
227 358
228 359 def child_exit(server, worker):
229 worker.log.info("[%-10s] worker child exit", worker.pid)
360 worker.log.info("pid=[%-10s] worker child exit", worker.pid)
230 361
231 362
232 363 def pre_request(worker, req):
233 364 worker.start_time = time.time()
234 365 worker.log.debug(
235 366 "GNCRN PRE WORKER [cnt:%s]: %s %s", worker.nr, req.method, req.path)
236 367
237 368
238 369 def post_request(worker, req, environ, resp):
239 370 total_time = time.time() - worker.start_time
240 371 # Gunicorn sometimes has problems with reading the status_code
241 372 status_code = getattr(resp, 'status_code', '')
242 373 worker.log.debug(
243 374 "GNCRN POST WORKER [cnt:%s]: %s %s resp: %s, Load Time: %.4fs",
244 375 worker.nr, req.method, req.path, status_code, total_time)
245 376 _check_memory_usage(worker)
246 377
247 378
379 def _filter_proxy(ip):
380 """
381 Passed in IP addresses in HEADERS can be in a special format of multiple
382 ips. Those comma separated IPs are passed from various proxies in the
383 chain of request processing. The left-most being the original client.
384 We only care about the first IP which came from the org. client.
385
386 :param ip: ip string from headers
387 """
388 if ',' in ip:
389 _ips = ip.split(',')
390 _first_ip = _ips[0].strip()
391 return _first_ip
392 return ip
393
394
395 def _filter_port(ip):
396 """
397 Removes a port from ip, there are 4 main cases to handle here.
398 - ipv4 eg. 127.0.0.1
399 - ipv6 eg. ::1
400 - ipv4+port eg. 127.0.0.1:8080
401 - ipv6+port eg. [::1]:8080
402
403 :param ip:
404 """
405 def is_ipv6(ip_addr):
406 if hasattr(socket, 'inet_pton'):
407 try:
408 socket.inet_pton(socket.AF_INET6, ip_addr)
409 except socket.error:
410 return False
411 else:
412 return False
413 return True
414
415 if ':' not in ip: # must be ipv4 pure ip
416 return ip
417
418 if '[' in ip and ']' in ip: # ipv6 with port
419 return ip.split(']')[0][1:].lower()
420
421 # must be ipv6 or ipv4 with port
422 if is_ipv6(ip):
423 return ip
424 else:
425 ip, _port = ip.split(':')[:2] # means ipv4+port
426 return ip
427
428
429 def get_ip_addr(environ):
430 proxy_key = 'HTTP_X_REAL_IP'
431 proxy_key2 = 'HTTP_X_FORWARDED_FOR'
432 def_key = 'REMOTE_ADDR'
433
434 def _filters(x):
435 return _filter_port(_filter_proxy(x))
436
437 ip = environ.get(proxy_key)
438 if ip:
439 return _filters(ip)
440
441 ip = environ.get(proxy_key2)
442 if ip:
443 return _filters(ip)
444
445 ip = environ.get(def_key, '0.0.0.0')
446 return _filters(ip)
447
448
248 449 class RhodeCodeLogger(Logger):
249 450 """
250 451 Custom Logger that allows some customization that gunicorn doesn't allow
251 452 """
252 453
253 454 datefmt = r"%Y-%m-%d %H:%M:%S"
254 455
255 456 def __init__(self, cfg):
256 457 Logger.__init__(self, cfg)
257 458
258 459 def now(self):
259 460 """ return date in RhodeCode Log format """
260 461 now = time.time()
261 msecs = int((now - long(now)) * 1000)
462 msecs = int((now - int(now)) * 1000)
262 463 return time.strftime(self.datefmt, time.localtime(now)) + '.{0:03d}'.format(msecs)
263 464
465 def atoms(self, resp, req, environ, request_time):
466 """ Gets atoms for log formatting.
467 """
468 status = resp.status
469 if isinstance(status, str):
470 status = status.split(None, 1)[0]
471 atoms = {
472 'h': get_ip_addr(environ),
473 'l': '-',
474 'u': self._get_user(environ) or '-',
475 't': self.now(),
476 'r': "%s %s %s" % (environ['REQUEST_METHOD'],
477 environ['RAW_URI'],
478 environ["SERVER_PROTOCOL"]),
479 's': status,
480 'm': environ.get('REQUEST_METHOD'),
481 'U': environ.get('PATH_INFO'),
482 'q': environ.get('QUERY_STRING'),
483 'H': environ.get('SERVER_PROTOCOL'),
484 'b': getattr(resp, 'sent', None) is not None and str(resp.sent) or '-',
485 'B': getattr(resp, 'sent', None),
486 'f': environ.get('HTTP_REFERER', '-'),
487 'a': environ.get('HTTP_USER_AGENT', '-'),
488 'T': request_time.seconds,
489 'D': (request_time.seconds * 1000000) + request_time.microseconds,
490 'M': (request_time.seconds * 1000) + int(request_time.microseconds/1000),
491 'L': "%d.%06d" % (request_time.seconds, request_time.microseconds),
492 'p': "<%s>" % os.getpid()
493 }
494
495 # add request headers
496 if hasattr(req, 'headers'):
497 req_headers = req.headers
498 else:
499 req_headers = req
500
501 if hasattr(req_headers, "items"):
502 req_headers = req_headers.items()
503
504 atoms.update({"{%s}i" % k.lower(): v for k, v in req_headers})
505
506 resp_headers = resp.headers
507 if hasattr(resp_headers, "items"):
508 resp_headers = resp_headers.items()
509
510 # add response headers
511 atoms.update({"{%s}o" % k.lower(): v for k, v in resp_headers})
512
513 # add environ variables
514 environ_variables = environ.items()
515 atoms.update({"{%s}e" % k.lower(): v for k, v in environ_variables})
516
517 return atoms
518
264 519
265 520 logger_class = RhodeCodeLogger
@@ -1,800 +1,816 b''
1 ## -*- coding: utf-8 -*-
2 1
3 2 ; #########################################
4 3 ; RHODECODE COMMUNITY EDITION CONFIGURATION
5 4 ; #########################################
6 5
7 6 [DEFAULT]
8 7 ; Debug flag sets all loggers to debug, and enables request tracking
9 8 debug = false
10 9
11 10 ; ########################################################################
12 11 ; EMAIL CONFIGURATION
13 12 ; These settings will be used by the RhodeCode mailing system
14 13 ; ########################################################################
15 14
16 15 ; prefix all emails subjects with given prefix, helps filtering out emails
17 16 #email_prefix = [RhodeCode]
18 17
19 18 ; email FROM address all mails will be sent
20 19 #app_email_from = rhodecode-noreply@localhost
21 20
22 21 #smtp_server = mail.server.com
23 22 #smtp_username =
24 23 #smtp_password =
25 24 #smtp_port =
26 25 #smtp_use_tls = false
27 26 #smtp_use_ssl = true
28 27
29 28 [server:main]
30 ; COMMON HOST/IP CONFIG
29 ; COMMON HOST/IP CONFIG, This applies mostly to develop setup,
30 ; Host port for gunicorn are controlled by gunicorn_conf.py
31 31 host = 127.0.0.1
32 port = 5000
32 port = 10020
33 33
34 34
35 35 ; ###########################
36 36 ; GUNICORN APPLICATION SERVER
37 37 ; ###########################
38 38
39 ; run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
39 ; run with gunicorn --paste rhodecode.ini --config gunicorn_conf.py
40 40
41 41 ; Module to use, this setting shouldn't be changed
42 42 use = egg:gunicorn#main
43 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
70
71 ; Amount of time a worker can spend with handling a request before it
72 ; gets killed and restarted. By default set to 21600 (6hrs)
73 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
74 timeout = 21600
75
76 ; The maximum size of HTTP request line in bytes.
77 ; 0 for unlimited
78 limit_request_line = 0
79
80 ; Limit the number of HTTP headers fields in a request.
81 ; By default this value is 100 and can't be larger than 32768.
82 limit_request_fields = 32768
83
84 ; Limit the allowed size of an HTTP request header field.
85 ; Value is a positive number or 0.
86 ; Setting it to 0 will allow unlimited header field sizes.
87 limit_request_field_size = 0
88
89 ; Timeout for graceful workers restart.
90 ; After receiving a restart signal, workers have this much time to finish
91 ; serving requests. Workers still alive after the timeout (starting from the
92 ; receipt of the restart signal) are force killed.
93 ; Examples: 1800 (30min), 3600 (1hr), 7200 (2hr), 43200 (12h)
94 graceful_timeout = 3600
95
96 # The number of seconds to wait for requests on a Keep-Alive connection.
97 # Generally set in the 1-5 seconds range.
98 keepalive = 2
99
100 ; Maximum memory usage that each worker can use before it will receive a
101 ; graceful restart signal 0 = memory monitoring is disabled
102 ; Examples: 268435456 (256MB), 536870912 (512MB)
103 ; 1073741824 (1GB), 2147483648 (2GB), 4294967296 (4GB)
104 memory_max_usage = 0
105
106 ; How often in seconds to check for memory usage for each gunicorn worker
107 memory_usage_check_interval = 60
108
109 ; Threshold value for which we don't recycle worker if GarbageCollection
110 ; frees up enough resources. Before each restart we try to run GC on worker
111 ; in case we get enough free memory after that, restart will not happen.
112 memory_usage_recovery_threshold = 0.8
113
114
115 44 ; Prefix middleware for RhodeCode.
116 45 ; recommended when using proxy setup.
117 46 ; allows to set RhodeCode under a prefix in server.
118 47 ; eg https://server.com/custom_prefix. Enable `filter-with =` option below as well.
119 48 ; And set your prefix like: `prefix = /custom_prefix`
120 49 ; be sure to also set beaker.session.cookie_path = /custom_prefix if you need
121 50 ; to make your cookies only work on prefix url
122 51 [filter:proxy-prefix]
123 52 use = egg:PasteDeploy#prefix
124 53 prefix = /
125 54
126 55 [app:main]
127 56 ; The %(here)s variable will be replaced with the absolute path of parent directory
128 57 ; of this file
129 ; In addition ENVIRONMENT variables usage is possible, e.g
130 ; sqlalchemy.db1.url = {ENV_RC_DB_URL}
58 ; Each option in the app:main can be override by an environmental variable
59 ;
60 ;To override an option:
61 ;
62 ;RC_<KeyName>
63 ;Everything should be uppercase, . and - should be replaced by _.
64 ;For example, if you have these configuration settings:
65 ;rc_cache.repo_object.backend = foo
66 ;can be overridden by
67 ;export RC_CACHE_REPO_OBJECT_BACKEND=foo
131 68
132 69 use = egg:rhodecode-enterprise-ce
133 70
134 71 ; enable proxy prefix middleware, defined above
135 72 #filter-with = proxy-prefix
136 73
137 74 ; encryption key used to encrypt social plugin tokens,
138 75 ; remote_urls with credentials etc, if not set it defaults to
139 76 ; `beaker.session.secret`
140 77 #rhodecode.encrypted_values.secret =
141 78
142 79 ; decryption strict mode (enabled by default). It controls if decryption raises
143 80 ; `SignatureVerificationError` in case of wrong key, or damaged encryption data.
144 81 #rhodecode.encrypted_values.strict = false
145 82
146 83 ; Pick algorithm for encryption. Either fernet (more secure) or aes (default)
147 84 ; fernet is safer, and we strongly recommend switching to it.
148 85 ; Due to backward compatibility aes is used as default.
149 86 #rhodecode.encrypted_values.algorithm = fernet
150 87
151 88 ; Return gzipped responses from RhodeCode (static files/application)
152 89 gzip_responses = false
153 90
154 91 ; Auto-generate javascript routes file on startup
155 92 generate_js_files = false
156 93
157 94 ; System global default language.
158 95 ; All available languages: en (default), be, de, es, fr, it, ja, pl, pt, ru, zh
159 96 lang = en
160 97
161 98 ; Perform a full repository scan and import on each server start.
162 99 ; Settings this to true could lead to very long startup time.
163 100 startup.import_repos = false
164 101
165 ; Uncomment and set this path to use archive download cache.
166 ; Once enabled, generated archives will be cached at this location
167 ; and served from the cache during subsequent requests for the same archive of
168 ; the repository.
169 #archive_cache_dir = /tmp/tarballcache
170
171 102 ; URL at which the application is running. This is used for Bootstrapping
172 103 ; requests in context when no web request is available. Used in ishell, or
173 104 ; SSH calls. Set this for events to receive proper url for SSH calls.
174 105 app.base_url = http://rhodecode.local
175 106
176 107 ; Unique application ID. Should be a random unique string for security.
177 108 app_instance_uuid = rc-production
178 109
179 110 ; Cut off limit for large diffs (size in bytes). If overall diff size on
180 111 ; commit, or pull request exceeds this limit this diff will be displayed
181 112 ; partially. E.g 512000 == 512Kb
182 113 cut_off_limit_diff = 512000
183 114
184 115 ; Cut off limit for large files inside diffs (size in bytes). Each individual
185 116 ; file inside diff which exceeds this limit will be displayed partially.
186 117 ; E.g 128000 == 128Kb
187 118 cut_off_limit_file = 128000
188 119
189 120 ; Use cached version of vcs repositories everywhere. Recommended to be `true`
190 121 vcs_full_cache = true
191 122
192 123 ; Force https in RhodeCode, fixes https redirects, assumes it's always https.
193 124 ; Normally this is controlled by proper flags sent from http server such as Nginx or Apache
194 125 force_https = false
195 126
196 127 ; use Strict-Transport-Security headers
197 128 use_htsts = false
198 129
199 130 ; Set to true if your repos are exposed using the dumb protocol
200 131 git_update_server_info = false
201 132
202 133 ; RSS/ATOM feed options
203 134 rss_cut_off_limit = 256000
204 135 rss_items_per_page = 10
205 136 rss_include_diff = false
206 137
207 138 ; gist URL alias, used to create nicer urls for gist. This should be an
208 139 ; url that does rewrites to _admin/gists/{gistid}.
209 140 ; example: http://gist.rhodecode.org/{gistid}. Empty means use the internal
210 141 ; RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/{gistid}
211 142 gist_alias_url =
212 143
213 144 ; List of views (using glob pattern syntax) that AUTH TOKENS could be
214 145 ; used for access.
215 146 ; Adding ?auth_token=TOKEN_HASH to the url authenticates this request as if it
216 147 ; came from the the logged in user who own this authentication token.
217 148 ; Additionally @TOKEN syntax can be used to bound the view to specific
218 149 ; authentication token. Such view would be only accessible when used together
219 150 ; with this authentication token
220 151 ; list of all views can be found under `/_admin/permissions/auth_token_access`
221 152 ; The list should be "," separated and on a single line.
222 153 ; Most common views to enable:
223 154
224 155 # RepoCommitsView:repo_commit_download
225 156 # RepoCommitsView:repo_commit_patch
226 157 # RepoCommitsView:repo_commit_raw
227 158 # RepoCommitsView:repo_commit_raw@TOKEN
228 159 # RepoFilesView:repo_files_diff
229 160 # RepoFilesView:repo_archivefile
230 161 # RepoFilesView:repo_file_raw
231 162 # GistView:*
232 163 api_access_controllers_whitelist =
233 164
234 165 ; Default encoding used to convert from and to unicode
235 166 ; can be also a comma separated list of encoding in case of mixed encodings
236 167 default_encoding = UTF-8
237 168
238 169 ; instance-id prefix
239 170 ; a prefix key for this instance used for cache invalidation when running
240 171 ; multiple instances of RhodeCode, make sure it's globally unique for
241 172 ; all running RhodeCode instances. Leave empty if you don't use it
242 173 instance_id =
243 174
244 175 ; Fallback authentication plugin. Set this to a plugin ID to force the usage
245 176 ; of an authentication plugin also if it is disabled by it's settings.
246 177 ; This could be useful if you are unable to log in to the system due to broken
247 178 ; authentication settings. Then you can enable e.g. the internal RhodeCode auth
248 179 ; module to log in again and fix the settings.
249 180 ; Available builtin plugin IDs (hash is part of the ID):
250 181 ; egg:rhodecode-enterprise-ce#rhodecode
251 182 ; egg:rhodecode-enterprise-ce#pam
252 183 ; egg:rhodecode-enterprise-ce#ldap
253 184 ; egg:rhodecode-enterprise-ce#jasig_cas
254 185 ; egg:rhodecode-enterprise-ce#headers
255 186 ; egg:rhodecode-enterprise-ce#crowd
256 187
257 188 #rhodecode.auth_plugin_fallback = egg:rhodecode-enterprise-ce#rhodecode
258 189
259 190 ; Flag to control loading of legacy plugins in py:/path format
260 191 auth_plugin.import_legacy_plugins = true
261 192
262 193 ; alternative return HTTP header for failed authentication. Default HTTP
263 194 ; response is 401 HTTPUnauthorized. Currently HG clients have troubles with
264 195 ; handling that causing a series of failed authentication calls.
265 196 ; Set this variable to 403 to return HTTPForbidden, or any other HTTP code
266 197 ; This will be served instead of default 401 on bad authentication
267 198 auth_ret_code =
268 199
269 200 ; use special detection method when serving auth_ret_code, instead of serving
270 201 ; ret_code directly, use 401 initially (Which triggers credentials prompt)
271 202 ; and then serve auth_ret_code to clients
272 203 auth_ret_code_detection = false
273 204
274 205 ; locking return code. When repository is locked return this HTTP code. 2XX
275 206 ; codes don't break the transactions while 4XX codes do
276 207 lock_ret_code = 423
277 208
278 209 ; allows to change the repository location in settings page
279 210 allow_repo_location_change = true
280 211
281 212 ; allows to setup custom hooks in settings page
282 213 allow_custom_hooks_settings = true
283 214
284 215 ; Generated license token required for EE edition license.
285 216 ; New generated token value can be found in Admin > settings > license page.
286 217 license_token =
287 218
288 219 ; This flag hides sensitive information on the license page such as token, and license data
289 220 license.hide_license_info = false
290 221
291 222 ; supervisor connection uri, for managing supervisor and logs.
292 223 supervisor.uri =
293 224
294 225 ; supervisord group name/id we only want this RC instance to handle
295 226 supervisor.group_id = prod
296 227
297 228 ; Display extended labs settings
298 229 labs_settings_active = true
299 230
300 231 ; Custom exception store path, defaults to TMPDIR
301 232 ; This is used to store exception from RhodeCode in shared directory
302 233 #exception_tracker.store_path =
303 234
304 235 ; Send email with exception details when it happens
305 236 #exception_tracker.send_email = false
306 237
307 238 ; Comma separated list of recipients for exception emails,
308 239 ; e.g admin@rhodecode.com,devops@rhodecode.com
309 240 ; Can be left empty, then emails will be sent to ALL super-admins
310 241 #exception_tracker.send_email_recipients =
311 242
312 243 ; optional prefix to Add to email Subject
313 244 #exception_tracker.email_prefix = [RHODECODE ERROR]
314 245
315 246 ; File store configuration. This is used to store and serve uploaded files
316 247 file_store.enabled = true
317 248
318 249 ; Storage backend, available options are: local
319 250 file_store.backend = local
320 251
321 252 ; path to store the uploaded binaries
322 253 file_store.storage_path = %(here)s/data/file_store
323 254
255 ; Uncomment and set this path to control settings for archive download cache.
256 ; Generated repo archives will be cached at this location
257 ; and served from the cache during subsequent requests for the same archive of
258 ; the repository. This path is important to be shared across filesystems and with
259 ; RhodeCode and vcsserver
260
261 ; Default is $cache_dir/archive_cache if not set
262 archive_cache.store_dir = %(here)s/data/archive_cache
263
264 ; The limit in GB sets how much data we cache before recycling last used, defaults to 10 gb
265 archive_cache.cache_size_gb = 40
266
267 ; By default cache uses sharding technique, this specifies how many shards are there
268 archive_cache.cache_shards = 4
324 269
325 270 ; #############
326 271 ; CELERY CONFIG
327 272 ; #############
328 273
329 ; 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
274 ; manually run celery: /path/to/celery worker --task-events --beat --app rhodecode.lib.celerylib.loader --scheduler rhodecode.lib.celerylib.scheduler.RcScheduler --loglevel DEBUG --ini /path/to/rhodecode.ini
330 275
331 276 use_celery = false
332 277
278 ; path to store schedule database
279 #celerybeat-schedule.path =
280
333 281 ; connection url to the message broker (default redis)
334 celery.broker_url = redis://localhost:6379/8
282 celery.broker_url = redis://redis:6379/8
283
284 ; results backend to get results for (default redis)
285 celery.result_backend = redis://redis:6379/8
335 286
336 287 ; rabbitmq example
337 288 #celery.broker_url = amqp://rabbitmq:qweqwe@localhost:5672/rabbitmqhost
338 289
339 290 ; maximum tasks to execute before worker restart
340 celery.max_tasks_per_child = 100
291 celery.max_tasks_per_child = 20
341 292
342 293 ; tasks will never be sent to the queue, but executed locally instead.
343 294 celery.task_always_eager = false
344 295
345 296 ; #############
346 297 ; DOGPILE CACHE
347 298 ; #############
348 299
349 300 ; Default cache dir for caches. Putting this into a ramdisk can boost performance.
350 301 ; eg. /tmpfs/data_ramdisk, however this directory might require large amount of space
351 302 cache_dir = %(here)s/data
352 303
353 304 ; *********************************************
354 305 ; `sql_cache_short` cache for heavy SQL queries
355 306 ; Only supported backend is `memory_lru`
356 307 ; *********************************************
357 308 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
358 309 rc_cache.sql_cache_short.expiration_time = 30
359 310
360 311
361 312 ; *****************************************************
362 313 ; `cache_repo_longterm` cache for repo object instances
363 314 ; Only supported backend is `memory_lru`
364 315 ; *****************************************************
365 316 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
366 317 ; by default we use 30 Days, cache is still invalidated on push
367 318 rc_cache.cache_repo_longterm.expiration_time = 2592000
368 319 ; max items in LRU cache, set to smaller number to save memory, and expire last used caches
369 320 rc_cache.cache_repo_longterm.max_size = 10000
370 321
371 322
323 ; *********************************************
324 ; `cache_general` cache for general purpose use
325 ; for simplicity use rc.file_namespace backend,
326 ; for performance and scale use rc.redis
327 ; *********************************************
328 rc_cache.cache_general.backend = dogpile.cache.rc.file_namespace
329 rc_cache.cache_general.expiration_time = 43200
330 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
331 #rc_cache.cache_general.arguments.filename = /tmp/cache_general_db
332
333 ; alternative `cache_general` redis backend with distributed lock
334 #rc_cache.cache_general.backend = dogpile.cache.rc.redis
335 #rc_cache.cache_general.expiration_time = 300
336
337 ; redis_expiration_time needs to be greater then expiration_time
338 #rc_cache.cache_general.arguments.redis_expiration_time = 7200
339
340 #rc_cache.cache_general.arguments.host = localhost
341 #rc_cache.cache_general.arguments.port = 6379
342 #rc_cache.cache_general.arguments.db = 0
343 #rc_cache.cache_general.arguments.socket_timeout = 30
344 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
345 #rc_cache.cache_general.arguments.distributed_lock = true
346
347 ; auto-renew lock to prevent stale locks, slower but safer. Use only if problems happen
348 #rc_cache.cache_general.arguments.lock_auto_renewal = true
349
372 350 ; *************************************************
373 351 ; `cache_perms` cache for permission tree, auth TTL
352 ; for simplicity use rc.file_namespace backend,
353 ; for performance and scale use rc.redis
374 354 ; *************************************************
375 355 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
376 rc_cache.cache_perms.expiration_time = 300
356 rc_cache.cache_perms.expiration_time = 3600
377 357 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
378 #rc_cache.cache_perms.arguments.filename = /tmp/cache_perms.db
358 #rc_cache.cache_perms.arguments.filename = /tmp/cache_perms_db
379 359
380 360 ; alternative `cache_perms` redis backend with distributed lock
381 361 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
382 362 #rc_cache.cache_perms.expiration_time = 300
383 363
384 364 ; redis_expiration_time needs to be greater then expiration_time
385 365 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
386 366
387 367 #rc_cache.cache_perms.arguments.host = localhost
388 368 #rc_cache.cache_perms.arguments.port = 6379
389 369 #rc_cache.cache_perms.arguments.db = 0
390 370 #rc_cache.cache_perms.arguments.socket_timeout = 30
391 371 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
392 372 #rc_cache.cache_perms.arguments.distributed_lock = true
393 373
394 374 ; auto-renew lock to prevent stale locks, slower but safer. Use only if problems happen
395 375 #rc_cache.cache_perms.arguments.lock_auto_renewal = true
396 376
397 377 ; ***************************************************
398 378 ; `cache_repo` cache for file tree, Readme, RSS FEEDS
379 ; for simplicity use rc.file_namespace backend,
380 ; for performance and scale use rc.redis
399 381 ; ***************************************************
400 382 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
401 383 rc_cache.cache_repo.expiration_time = 2592000
402 384 ; file cache store path. Defaults to `cache_dir =` value or tempdir if both values are not set
403 #rc_cache.cache_repo.arguments.filename = /tmp/cache_repo.db
385 #rc_cache.cache_repo.arguments.filename = /tmp/cache_repo_db
404 386
405 387 ; alternative `cache_repo` redis backend with distributed lock
406 388 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
407 389 #rc_cache.cache_repo.expiration_time = 2592000
408 390
409 391 ; redis_expiration_time needs to be greater then expiration_time
410 392 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
411 393
412 394 #rc_cache.cache_repo.arguments.host = localhost
413 395 #rc_cache.cache_repo.arguments.port = 6379
414 396 #rc_cache.cache_repo.arguments.db = 1
415 397 #rc_cache.cache_repo.arguments.socket_timeout = 30
416 398 ; more Redis options: https://dogpilecache.sqlalchemy.org/en/latest/api.html#redis-backends
417 399 #rc_cache.cache_repo.arguments.distributed_lock = true
418 400
419 401 ; auto-renew lock to prevent stale locks, slower but safer. Use only if problems happen
420 402 #rc_cache.cache_repo.arguments.lock_auto_renewal = true
421 403
422 404 ; ##############
423 405 ; BEAKER SESSION
424 406 ; ##############
425 407
426 408 ; beaker.session.type is type of storage options for the logged users sessions. Current allowed
427 ; types are file, ext:redis, ext:database, ext:memcached, and memory (default if not specified).
428 ; Fastest ones are Redis and ext:database
409 ; types are file, ext:redis, ext:database, ext:memcached
410 ; Fastest ones are ext:redis and ext:database, DO NOT use memory type for session
429 411 beaker.session.type = file
430 412 beaker.session.data_dir = %(here)s/data/sessions
431 413
432 414 ; Redis based sessions
433 415 #beaker.session.type = ext:redis
434 416 #beaker.session.url = redis://127.0.0.1:6379/2
435 417
436 418 ; DB based session, fast, and allows easy management over logged in users
437 419 #beaker.session.type = ext:database
438 420 #beaker.session.table_name = db_session
439 421 #beaker.session.sa.url = postgresql://postgres:secret@localhost/rhodecode
440 422 #beaker.session.sa.url = mysql://root:secret@127.0.0.1/rhodecode
441 423 #beaker.session.sa.pool_recycle = 3600
442 424 #beaker.session.sa.echo = false
443 425
444 426 beaker.session.key = rhodecode
445 427 beaker.session.secret = production-rc-uytcxaz
446 428 beaker.session.lock_dir = %(here)s/data/sessions/lock
447 429
448 430 ; Secure encrypted cookie. Requires AES and AES python libraries
449 431 ; you must disable beaker.session.secret to use this
450 432 #beaker.session.encrypt_key = key_for_encryption
451 433 #beaker.session.validate_key = validation_key
452 434
453 435 ; Sets session as invalid (also logging out user) if it haven not been
454 436 ; accessed for given amount of time in seconds
455 437 beaker.session.timeout = 2592000
456 438 beaker.session.httponly = true
457 439
458 440 ; Path to use for the cookie. Set to prefix if you use prefix middleware
459 441 #beaker.session.cookie_path = /custom_prefix
460 442
461 443 ; Set https secure cookie
462 444 beaker.session.secure = false
463 445
464 446 ; default cookie expiration time in seconds, set to `true` to set expire
465 447 ; at browser close
466 448 #beaker.session.cookie_expires = 3600
467 449
468 450 ; #############################
469 451 ; SEARCH INDEXING CONFIGURATION
470 452 ; #############################
471 453
472 454 ; Full text search indexer is available in rhodecode-tools under
473 455 ; `rhodecode-tools index` command
474 456
475 457 ; WHOOSH Backend, doesn't require additional services to run
476 458 ; it works good with few dozen repos
477 459 search.module = rhodecode.lib.index.whoosh
478 460 search.location = %(here)s/data/index
479 461
480 462 ; ####################
481 463 ; CHANNELSTREAM CONFIG
482 464 ; ####################
483 465
484 466 ; channelstream enables persistent connections and live notification
485 467 ; in the system. It's also used by the chat system
486 468
487 469 channelstream.enabled = false
488 470
489 471 ; server address for channelstream server on the backend
490 472 channelstream.server = 127.0.0.1:9800
491 473
492 474 ; location of the channelstream server from outside world
493 475 ; use ws:// for http or wss:// for https. This address needs to be handled
494 476 ; by external HTTP server such as Nginx or Apache
495 477 ; see Nginx/Apache configuration examples in our docs
496 478 channelstream.ws_url = ws://rhodecode.yourserver.com/_channelstream
497 479 channelstream.secret = secret
498 480 channelstream.history.location = %(here)s/channelstream_history
499 481
500 482 ; Internal application path that Javascript uses to connect into.
501 483 ; If you use proxy-prefix the prefix should be added before /_channelstream
502 484 channelstream.proxy_path = /_channelstream
503 485
504 486
505 487 ; ##############################
506 488 ; MAIN RHODECODE DATABASE CONFIG
507 489 ; ##############################
508 490
509 491 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
510 492 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
511 493 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
512 494 ; pymysql is an alternative driver for MySQL, use in case of problems with default one
513 495 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
514 496
515 497 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
516 498
517 499 ; see sqlalchemy docs for other advanced settings
518 500 ; print the sql statements to output
519 501 sqlalchemy.db1.echo = false
520 502
521 503 ; recycle the connections after this amount of seconds
522 504 sqlalchemy.db1.pool_recycle = 3600
523 sqlalchemy.db1.convert_unicode = true
524 505
525 506 ; the number of connections to keep open inside the connection pool.
526 507 ; 0 indicates no limit
508 ; the general calculus with gevent is:
509 ; if your system allows 500 concurrent greenlets (max_connections) that all do database access,
510 ; then increase pool size + max overflow so that they add up to 500.
527 511 #sqlalchemy.db1.pool_size = 5
528 512
529 513 ; The number of connections to allow in connection pool "overflow", that is
530 514 ; connections that can be opened above and beyond the pool_size setting,
531 515 ; which defaults to five.
532 516 #sqlalchemy.db1.max_overflow = 10
533 517
534 518 ; Connection check ping, used to detect broken database connections
535 519 ; could be enabled to better handle cases if MySQL has gone away errors
536 520 #sqlalchemy.db1.ping_connection = true
537 521
538 522 ; ##########
539 523 ; VCS CONFIG
540 524 ; ##########
541 525 vcs.server.enable = true
542 526 vcs.server = localhost:9900
543 527
544 528 ; Web server connectivity protocol, responsible for web based VCS operations
545 529 ; Available protocols are:
546 530 ; `http` - use http-rpc backend (default)
547 531 vcs.server.protocol = http
548 532
549 533 ; Push/Pull operations protocol, available options are:
550 534 ; `http` - use http-rpc backend (default)
551 535 vcs.scm_app_implementation = http
552 536
553 537 ; Push/Pull operations hooks protocol, available options are:
554 538 ; `http` - use http-rpc backend (default)
555 539 vcs.hooks.protocol = http
556 540
557 ; Host on which this instance is listening for hooks. If vcsserver is in other location
558 ; this should be adjusted.
559 vcs.hooks.host = 127.0.0.1
541 ; Host on which this instance is listening for hooks. vcsserver will call this host to pull/push hooks so it should be
542 ; accessible via network.
543 ; Use vcs.hooks.host = "*" to bind to current hostname (for Docker)
544 vcs.hooks.host = *
560 545
561 546 ; Start VCSServer with this instance as a subprocess, useful for development
562 547 vcs.start_server = false
563 548
564 549 ; List of enabled VCS backends, available options are:
565 550 ; `hg` - mercurial
566 551 ; `git` - git
567 552 ; `svn` - subversion
568 553 vcs.backends = hg, git, svn
569 554
570 555 ; Wait this number of seconds before killing connection to the vcsserver
571 556 vcs.connection_timeout = 3600
572 557
573 558 ; Compatibility version when creating SVN repositories. Defaults to newest version when commented out.
574 559 ; Set a numeric version for your current SVN e.g 1.8, or 1.12
575 560 ; Legacy available options are: pre-1.4-compatible, pre-1.5-compatible, pre-1.6-compatible, pre-1.8-compatible, pre-1.9-compatible
576 561 #vcs.svn.compatible_version = 1.8
577 562
563 ; Cache flag to cache vcsserver remote calls locally
564 ; It uses cache_region `cache_repo`
565 vcs.methods.cache = true
578 566
579 567 ; ####################################################
580 568 ; Subversion proxy support (mod_dav_svn)
581 569 ; Maps RhodeCode repo groups into SVN paths for Apache
582 570 ; ####################################################
583 571
584 572 ; Enable or disable the config file generation.
585 573 svn.proxy.generate_config = false
586 574
587 575 ; Generate config file with `SVNListParentPath` set to `On`.
588 576 svn.proxy.list_parent_path = true
589 577
590 578 ; Set location and file name of generated config file.
591 579 svn.proxy.config_file_path = %(here)s/mod_dav_svn.conf
592 580
593 581 ; alternative mod_dav config template. This needs to be a valid mako template
594 582 ; Example template can be found in the source code:
595 583 ; rhodecode/apps/svn_support/templates/mod-dav-svn.conf.mako
596 584 #svn.proxy.config_template = ~/.rccontrol/enterprise-1/custom_svn_conf.mako
597 585
598 586 ; Used as a prefix to the `Location` block in the generated config file.
599 587 ; In most cases it should be set to `/`.
600 588 svn.proxy.location_root = /
601 589
602 590 ; Command to reload the mod dav svn configuration on change.
603 591 ; Example: `/etc/init.d/apache2 reload` or /home/USER/apache_reload.sh
604 592 ; Make sure user who runs RhodeCode process is allowed to reload Apache
605 593 #svn.proxy.reload_cmd = /etc/init.d/apache2 reload
606 594
607 595 ; If the timeout expires before the reload command finishes, the command will
608 596 ; be killed. Setting it to zero means no timeout. Defaults to 10 seconds.
609 597 #svn.proxy.reload_timeout = 10
610 598
611 599 ; ####################
612 600 ; SSH Support Settings
613 601 ; ####################
614 602
615 603 ; Defines if a custom authorized_keys file should be created and written on
616 604 ; any change user ssh keys. Setting this to false also disables possibility
617 605 ; of adding SSH keys by users from web interface. Super admins can still
618 606 ; manage SSH Keys.
619 607 ssh.generate_authorized_keyfile = false
620 608
621 609 ; Options for ssh, default is `no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding`
622 610 # ssh.authorized_keys_ssh_opts =
623 611
624 612 ; Path to the authorized_keys file where the generate entries are placed.
625 613 ; It is possible to have multiple key files specified in `sshd_config` e.g.
626 614 ; AuthorizedKeysFile %h/.ssh/authorized_keys %h/.ssh/authorized_keys_rhodecode
627 615 ssh.authorized_keys_file_path = ~/.ssh/authorized_keys_rhodecode
628 616
629 617 ; Command to execute the SSH wrapper. The binary is available in the
630 618 ; RhodeCode installation directory.
631 619 ; e.g ~/.rccontrol/community-1/profile/bin/rc-ssh-wrapper
632 620 ssh.wrapper_cmd = ~/.rccontrol/community-1/rc-ssh-wrapper
633 621
634 622 ; Allow shell when executing the ssh-wrapper command
635 623 ssh.wrapper_cmd_allow_shell = false
636 624
637 625 ; Enables logging, and detailed output send back to the client during SSH
638 626 ; operations. Useful for debugging, shouldn't be used in production.
639 627 ssh.enable_debug_logging = false
640 628
641 629 ; Paths to binary executable, by default they are the names, but we can
642 630 ; override them if we want to use a custom one
643 631 ssh.executable.hg = ~/.rccontrol/vcsserver-1/profile/bin/hg
644 632 ssh.executable.git = ~/.rccontrol/vcsserver-1/profile/bin/git
645 633 ssh.executable.svn = ~/.rccontrol/vcsserver-1/profile/bin/svnserve
646 634
647 635 ; Enables SSH key generator web interface. Disabling this still allows users
648 636 ; to add their own keys.
649 637 ssh.enable_ui_key_generator = true
650 638
651 639
652 640 ; #################
653 641 ; APPENLIGHT CONFIG
654 642 ; #################
655 643
656 644 ; Appenlight is tailored to work with RhodeCode, see
657 645 ; http://appenlight.rhodecode.com for details how to obtain an account
658 646
659 647 ; Appenlight integration enabled
660 appenlight = false
648 #appenlight = false
661 649
662 appenlight.server_url = https://api.appenlight.com
663 appenlight.api_key = YOUR_API_KEY
650 #appenlight.server_url = https://api.appenlight.com
651 #appenlight.api_key = YOUR_API_KEY
664 652 #appenlight.transport_config = https://api.appenlight.com?threaded=1&timeout=5
665 653
666 654 ; used for JS client
667 appenlight.api_public_key = YOUR_API_PUBLIC_KEY
655 #appenlight.api_public_key = YOUR_API_PUBLIC_KEY
668 656
669 657 ; TWEAK AMOUNT OF INFO SENT HERE
670 658
671 659 ; enables 404 error logging (default False)
672 appenlight.report_404 = false
660 #appenlight.report_404 = false
673 661
674 662 ; time in seconds after request is considered being slow (default 1)
675 appenlight.slow_request_time = 1
663 #appenlight.slow_request_time = 1
676 664
677 665 ; record slow requests in application
678 666 ; (needs to be enabled for slow datastore recording and time tracking)
679 appenlight.slow_requests = true
667 #appenlight.slow_requests = true
680 668
681 669 ; enable hooking to application loggers
682 appenlight.logging = true
670 #appenlight.logging = true
683 671
684 672 ; minimum log level for log capture
685 appenlight.logging.level = WARNING
673 #ppenlight.logging.level = WARNING
686 674
687 675 ; send logs only from erroneous/slow requests
688 676 ; (saves API quota for intensive logging)
689 appenlight.logging_on_error = false
677 #appenlight.logging_on_error = false
690 678
691 679 ; list of additional keywords that should be grabbed from environ object
692 680 ; can be string with comma separated list of words in lowercase
693 681 ; (by default client will always send following info:
694 682 ; 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
695 683 ; start with HTTP* this list be extended with additional keywords here
696 appenlight.environ_keys_whitelist =
684 #appenlight.environ_keys_whitelist =
697 685
698 686 ; list of keywords that should be blanked from request object
699 687 ; can be string with comma separated list of words in lowercase
700 688 ; (by default client will always blank keys that contain following words
701 689 ; 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
702 690 ; this list be extended with additional keywords set here
703 appenlight.request_keys_blacklist =
691 #appenlight.request_keys_blacklist =
704 692
705 693 ; list of namespaces that should be ignores when gathering log entries
706 694 ; can be string with comma separated list of namespaces
707 695 ; (by default the client ignores own entries: appenlight_client.client)
708 appenlight.log_namespace_blacklist =
696 #appenlight.log_namespace_blacklist =
697
698 ; Statsd client config, this is used to send metrics to statsd
699 ; We recommend setting statsd_exported and scrape them using Prometheus
700 #statsd.enabled = false
701 #statsd.statsd_host = 0.0.0.0
702 #statsd.statsd_port = 8125
703 #statsd.statsd_prefix =
704 #statsd.statsd_ipv6 = false
705
706 ; configure logging automatically at server startup set to false
707 ; to use the below custom logging config.
708 ; RC_LOGGING_FORMATTER
709 ; RC_LOGGING_LEVEL
710 ; env variables can control the settings for logging in case of autoconfigure
711
712 #logging.autoconfigure = true
713
714 ; specify your own custom logging config file to configure logging
715 #logging.logging_conf_file = /path/to/custom_logging.ini
709 716
710 717 ; Dummy marker to add new entries after.
711 718 ; Add any custom entries below. Please don't remove this marker.
712 719 custom.conf = 1
713 720
714 721
715 722 ; #####################
716 723 ; LOGGING CONFIGURATION
717 724 ; #####################
725
718 726 [loggers]
719 727 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
720 728
721 729 [handlers]
722 730 keys = console, console_sql
723 731
724 732 [formatters]
725 keys = generic, color_formatter, color_formatter_sql
733 keys = generic, json, color_formatter, color_formatter_sql
726 734
727 735 ; #######
728 736 ; LOGGERS
729 737 ; #######
730 738 [logger_root]
731 739 level = NOTSET
732 740 handlers = console
733 741
734 742 [logger_sqlalchemy]
735 743 level = INFO
736 744 handlers = console_sql
737 745 qualname = sqlalchemy.engine
738 746 propagate = 0
739 747
740 748 [logger_beaker]
741 749 level = DEBUG
742 750 handlers =
743 751 qualname = beaker.container
744 752 propagate = 1
745 753
746 754 [logger_rhodecode]
747 755 level = DEBUG
748 756 handlers =
749 757 qualname = rhodecode
750 758 propagate = 1
751 759
752 760 [logger_ssh_wrapper]
753 761 level = DEBUG
754 762 handlers =
755 763 qualname = ssh_wrapper
756 764 propagate = 1
757 765
758 766 [logger_celery]
759 767 level = DEBUG
760 768 handlers =
761 769 qualname = celery
762 770
763 771
764 772 ; ########
765 773 ; HANDLERS
766 774 ; ########
767 775
768 776 [handler_console]
769 777 class = StreamHandler
770 778 args = (sys.stderr, )
771 779 level = INFO
780 ; To enable JSON formatted logs replace 'generic/color_formatter' with 'json'
781 ; This allows sending properly formatted logs to grafana loki or elasticsearch
772 782 formatter = generic
773 783
774 784 [handler_console_sql]
775 785 ; "level = DEBUG" logs SQL queries and results.
776 786 ; "level = INFO" logs SQL queries.
777 787 ; "level = WARN" logs neither. (Recommended for production systems.)
778 788 class = StreamHandler
779 789 args = (sys.stderr, )
780 790 level = WARN
791 ; To enable JSON formatted logs replace 'generic/color_formatter_sql' with 'json'
792 ; This allows sending properly formatted logs to grafana loki or elasticsearch
781 793 formatter = generic
782 794
783 795 ; ##########
784 796 ; FORMATTERS
785 797 ; ##########
786 798
787 799 [formatter_generic]
788 800 class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
789 801 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
790 802 datefmt = %Y-%m-%d %H:%M:%S
791 803
792 804 [formatter_color_formatter]
793 805 class = rhodecode.lib.logging_formatter.ColorFormatter
794 806 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
795 807 datefmt = %Y-%m-%d %H:%M:%S
796 808
797 809 [formatter_color_formatter_sql]
798 810 class = rhodecode.lib.logging_formatter.ColorFormatterSql
799 811 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
800 812 datefmt = %Y-%m-%d %H:%M:%S
813
814 [formatter_json]
815 format = %(timestamp)s %(levelname)s %(name)s %(message)s %(req_id)s
816 class = rhodecode.lib._vendor.jsonlogger.JsonFormatter
@@ -1,9 +1,6 b''
1 # generating packages
2 nix-shell pkgs/shell-generate.nix
3 cd docs
4 pip2nix generate
1 ## BUILD
2 # cd docs
3 # docker build --tag sphinx-doc-build-rc .
5 4
6 # building the docs
7 cd docs
8 nix-build default.nix -o result
9 make clean html
5 # Build Docs
6 # docker run --rm -v $(PWD):/project --workdir=/project/docs sphinx-doc-build-rc make clean html No newline at end of file
@@ -1,183 +1,183 b''
1 1 # Makefile for Sphinx documentation
2 2 #
3 3
4 4 # You can set these variables from the command line.
5 SPHINXOPTS =
6 SPHINXBUILD = ./result/bin/sphinx-build
7 PAPER =
5 SPHINXOPTS ?=
6 SPHINXBUILD ?= sphinx-build
7 SOURCEDIR = source
8 8 BUILDDIR = _build
9 9
10 10 # User-friendly check for sphinx-build
11 11 ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
12 12 $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
13 13 endif
14 14
15 15 # Internal variables.
16 16 PAPEROPT_a4 = -D latex_paper_size=a4
17 17 PAPEROPT_letter = -D latex_paper_size=letter
18 18 ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
19 19 # the i18n builder cannot share the environment and doctrees with the others
20 20 I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
21 21
22 22 .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
23 23
24 24 help:
25 25 @echo "Please use \`make <target>' where <target> is one of"
26 26 @echo " html to make standalone HTML files"
27 27 @echo " dirhtml to make HTML files named index.html in directories"
28 28 @echo " singlehtml to make a single large HTML file"
29 29 @echo " pickle to make pickle files"
30 30 @echo " json to make JSON files"
31 31 @echo " htmlhelp to make HTML files and a HTML help project"
32 32 @echo " qthelp to make HTML files and a qthelp project"
33 33 @echo " devhelp to make HTML files and a Devhelp project"
34 34 @echo " epub to make an epub"
35 35 @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
36 36 @echo " latexpdf to make LaTeX files and run them through pdflatex"
37 37 @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
38 38 @echo " text to make text files"
39 39 @echo " man to make manual pages"
40 40 @echo " texinfo to make Texinfo files"
41 41 @echo " info to make Texinfo files and run them through makeinfo"
42 42 @echo " gettext to make PO message catalogs"
43 43 @echo " changes to make an overview of all changed/added/deprecated items"
44 44 @echo " xml to make Docutils-native XML files"
45 45 @echo " pseudoxml to make pseudoxml-XML files for display purposes"
46 46 @echo " linkcheck to check all external links for integrity"
47 47 @echo " doctest to run all doctests embedded in the documentation (if enabled)"
48 48
49 49 clean:
50 50 rm -rf $(BUILDDIR)/*
51 51
52 52 cleanup:
53 53 @echo "cleaning build dir"
54 54 rm -rf $(BUILDDIR)/*
55 55 @echo "cleaning result symlink"
56 56 rm -v result
57 57
58 58 html:
59 59 $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
60 60 @echo
61 61 @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
62 62
63 63 dirhtml:
64 64 $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
65 65 @echo
66 66 @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
67 67
68 68 singlehtml:
69 69 $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
70 70 @echo
71 71 @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
72 72
73 73 pickle:
74 74 $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
75 75 @echo
76 76 @echo "Build finished; now you can process the pickle files."
77 77
78 78 json:
79 79 $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
80 80 @echo
81 81 @echo "Build finished; now you can process the JSON files."
82 82
83 83 htmlhelp:
84 84 $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
85 85 @echo
86 86 @echo "Build finished; now you can run HTML Help Workshop with the" \
87 87 ".hhp project file in $(BUILDDIR)/htmlhelp."
88 88
89 89 qthelp:
90 90 $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
91 91 @echo
92 92 @echo "Build finished; now you can run "qcollectiongenerator" with the" \
93 93 ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
94 94 @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/RhodeCodeInstaller.qhcp"
95 95 @echo "To view the help file:"
96 96 @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/RhodeCodeInstaller.qhc"
97 97
98 98 devhelp:
99 99 $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
100 100 @echo
101 101 @echo "Build finished."
102 102 @echo "To view the help file:"
103 103 @echo "# mkdir -p $$HOME/.local/share/devhelp/RhodeCodeInstaller"
104 104 @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/RhodeCodeInstaller"
105 105 @echo "# devhelp"
106 106
107 107 epub:
108 108 $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
109 109 @echo
110 110 @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
111 111
112 112 latex:
113 113 $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
114 114 @echo
115 115 @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
116 116 @echo "Run \`make' in that directory to run these through (pdf)latex" \
117 117 "(use \`make latexpdf' here to do that automatically)."
118 118
119 119 latexpdf:
120 120 $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
121 121 @echo "Running LaTeX files through pdflatex..."
122 122 $(MAKE) -C $(BUILDDIR)/latex all-pdf
123 123 @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
124 124
125 125 latexpdfja:
126 126 $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
127 127 @echo "Running LaTeX files through platex and dvipdfmx..."
128 128 $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
129 129 @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
130 130
131 131 text:
132 132 $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
133 133 @echo
134 134 @echo "Build finished. The text files are in $(BUILDDIR)/text."
135 135
136 136 man:
137 137 $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
138 138 @echo
139 139 @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
140 140
141 141 texinfo:
142 142 $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
143 143 @echo
144 144 @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
145 145 @echo "Run \`make' in that directory to run these through makeinfo" \
146 146 "(use \`make info' here to do that automatically)."
147 147
148 148 info:
149 149 $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
150 150 @echo "Running Texinfo files through makeinfo..."
151 151 make -C $(BUILDDIR)/texinfo info
152 152 @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
153 153
154 154 gettext:
155 155 $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
156 156 @echo
157 157 @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
158 158
159 159 changes:
160 160 $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
161 161 @echo
162 162 @echo "The overview file is in $(BUILDDIR)/changes."
163 163
164 164 linkcheck:
165 165 $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
166 166 @echo
167 167 @echo "Link check complete; look for any errors in the above output " \
168 168 "or in $(BUILDDIR)/linkcheck/output.txt."
169 169
170 170 doctest:
171 171 $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
172 172 @echo "Testing of doctests in the sources finished, look at the " \
173 173 "results in $(BUILDDIR)/doctest/output.txt."
174 174
175 175 xml:
176 176 $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
177 177 @echo
178 178 @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
179 179
180 180 pseudoxml:
181 181 $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
182 182 @echo
183 183 @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
@@ -1,118 +1,119 b''
1 1 .. _repo-admin-tasks:
2 2
3 3 Common Admin Tasks for Repositories
4 4 -----------------------------------
5 5
6 6
7 7 Manually Force Delete Repository
8 8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9 9
10 10 In case of attached forks or pull-requests repositories should be archived.
11 11 Here is how to force delete a repository and remove all dependent objects
12 12
13 13
14 14 .. code-block:: bash
15 15 :dedent: 1
16 16
17 17 # starts the ishell interactive prompt
18 18 $ rccontrol ishell enterprise-1
19 19
20 20 .. code-block:: python
21 21 :dedent: 1
22 22
23 23 In [4]: from rhodecode.model.repo import RepoModel
24 24 In [3]: repo = Repository.get_by_repo_name('test_repos/repo_with_prs')
25 25 In [5]: RepoModel().delete(repo, forks='detach', pull_requests='delete')
26 26 In [6]: Session().commit()
27 27
28 28
29 29 Below is a fully automated example to force delete repositories reading from a
30 30 file where each line is a repository name. This can be executed via simple CLI command
31 31 without entering the interactive shell.
32 32
33 33 Save the below content as a file named `repo_delete_task.py`
34 34
35 35
36 36 .. code-block:: python
37 37 :dedent: 1
38 38
39 39 from rhodecode.model.db import *
40 40 from rhodecode.model.repo import RepoModel
41 41 with open('delete_repos.txt', 'rb') as f:
42 42 # read all lines from file
43 43 repos = f.readlines()
44 44 for repo_name in repos:
45 45 repo_name = repo_name.strip() # cleanup the name just in case
46 46 repo = Repository.get_by_repo_name(repo_name)
47 47 if not repo:
48 48 raise Exception('Repo with name {} not found'.format(repo_name))
49 49 RepoModel().delete(repo, forks='detach', pull_requests='delete')
50 50 Session().commit()
51 51 print('Removed repository {}'.format(repo_name))
52 52
53 53
54 54 The code above will read the names of repositories from a file called `delete_repos.txt`
55 55 Each lines should represent a single name e.g `repo_name_1` or `repo_group/repo_name_2`
56 56
57 57 Run this line from CLI to execute the code from the `repo_delete_task.py` file and
58 58 exit the ishell after the execution::
59 59
60 60 echo "%run repo_delete_task.py" | rccontrol ishell enterprise-1
61 61
62 62
63 63
64 64
65 65 Bulk edit permissions for all repositories or groups
66 66 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
67 67
68 68 In case when a permissions should be applied in bulk here are two ways to apply
69 69 the permissions onto *all* repositories and/or repository groups.
70 70
71 71 1) Start by running the interactive ishell interface
72 72
73 73 .. code-block:: bash
74 74 :dedent: 1
75 75
76 76 # starts the ishell interactive prompt
77 77 $ rccontrol ishell enterprise-1
78 78
79 79
80 80 2a) Add user called 'admin' into all repositories with write permission.
81 81 Permissions can be also `repository.read`, `repository.admin`, `repository.none`
82 82
83
83 84 .. code-block:: python
84 :dedent: 1
85 :dedent:
85 86
86 87 In [1]: from rhodecode.model.repo import RepoModel
87 88 In [2]: user = User.get_by_username('admin')
88 89 In [3]: permission_name = 'repository.write'
89 90 In [4]: for repo in Repository.get_all():
90 91 ...: RepoModel().grant_user_permission(repo, user, permission_name)
91 92 ...: Session().commit()
92 93
93 94 2b) Add user called 'admin' into all repository groups with write permission.
94 95 Permissions can be also can be `group.read`, `group.admin`, `group.none`
95 96
96 97 .. code-block:: python
97 :dedent: 1
98 :dedent:
98 99
99 100 In [1]: from rhodecode.model.repo import RepoModel
100 101 In [2]: user = User.get_by_username('admin')
101 102 In [3]: permission_name = 'group.write'
102 103 In [4]: for repo_group in RepoGroup.get_all():
103 104 ...: RepoGroupModel().grant_user_permission(repo_group, user, permission_name)
104 105 ...: Session().commit()
105 106
106 107
107 108 Delete a problematic pull request
108 109 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
109 110
110 111 .. code-block:: python
111 :dedent: 1
112 :dedent:
112 113
113 114 In [1]: from rhodecode.model.pull_request import PullRequestModel
114 115 In [2]: pullrequest_id = 123
115 116 In [3]: pr = PullRequest.get(pullrequest_id)
116 117 In [4]: super_admin = User.get_first_super_admin()
117 118 In [5]: PullRequestModel().delete(pr, super_admin)
118 119 In [6]: Session().commit()
@@ -1,151 +1,151 b''
1 1 .. _rhodecode-reset-ref:
2 2
3 3 Settings Management
4 4 -------------------
5 5
6 6 All |RCE| settings can be set from the user interface, but in the event that
7 7 it somehow becomes unavailable you can use ``ishell`` inside your |RCE|
8 8 ``virtualenv`` to carry out emergency measures.
9 9
10 10 .. warning::
11 11
12 12 Logging into the |RCE| database with ``iShell`` should only be done by an
13 13 experienced and knowledgeable database administrator.
14 14
15 15
16 16 Reset Admin Account Privileges
17 17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
18 18
19 19 If you accidentally remove your admin privileges from the admin account you
20 20 can restore them using ``ishell``. Use the following example to reset your
21 21 account permissions.
22 22
23 23 .. code-block:: bash
24 24
25 25 # Open iShell from the terminal
26 26 $ rccontrol ishell enterprise-1
27 27
28 .. code-block:: mysql
28 .. code-block:: python
29 29
30 30 # Use this example to change user permissions
31 31 In [1]: adminuser = User.get_by_username('username')
32 32 In [2]: adminuser.admin = True
33 33 In [3]: Session().add(adminuser);Session().commit()
34 34 In [4]: exit()
35 35
36 36
37 37 Set to read global ``.hgrc`` file
38 38 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
39 39
40 40 By default, |RCE| does not read global ``hgrc`` files in
41 41 ``/etc/mercurial/hgrc`` or ``/etc/mercurial/hgrc.d`` because it
42 42 can lead to issues. This is set in the ``rhodecode_ui`` table for which
43 43 there is no UI. If you need to edit this you can
44 44 manually change the settings using SQL statements with ``ishell``. Use the
45 45 following example to make changes to this table.
46 46
47 47 .. code-block:: bash
48 48
49 49 # Open iShell from the terminal
50 50 $ rccontrol ishell enterprise-1
51 51
52 .. code-block:: mysql
52 .. code-block:: python
53 53
54 54 # Use this example to enable global .hgrc access
55 55 In [1]: new_option = RhodeCodeUi()
56 56 In [2]: new_option.ui_section='web'
57 57 In [3]: new_option.ui_key='allow_push'
58 58 In [4]: new_option.ui_value='*'
59 59 In [5]: Session().add(new_option);Session().commit()
60 60 In [6]: exit()
61 61
62 62
63 63 Manually Reset Password
64 64 ^^^^^^^^^^^^^^^^^^^^^^^
65 65
66 66 If you need to manually reset a user password, use the following steps.
67 67
68 68 1. Navigate to your |RCE| install location.
69 69 2. Run the interactive ``ishell`` prompt.
70 70 3. Set a new password.
71 71
72 72 Use the following code example to carry out these steps.
73 73
74 74 .. code-block:: bash
75 75
76 76 # starts the ishell interactive prompt
77 77 $ rccontrol ishell enterprise-1
78 78
79 .. code-block:: mysql
79 .. code-block:: python
80 80
81 81 In [1]: from rhodecode.lib.auth import generate_auth_token
82 82 In [2]: from rhodecode.lib.auth import get_crypt_password
83 83 # Enter the user name whose password you wish to change
84 84 In [3]: my_user = 'USERNAME'
85 85 In [4]: u = User.get_by_username(my_user)
86 86 # If this fails then the user does not exist
87 87 In [5]: u.auth_token = generate_auth_token(my_user)
88 88 # Set the new password
89 89 In [6]: u.password = get_crypt_password('PASSWORD')
90 90 In [7]: Session().add(u);Session().commit()
91 91 In [8]: exit()
92 92
93 93
94 94 Change user details
95 95 ^^^^^^^^^^^^^^^^^^^
96 96
97 97 If you need to manually change some of users details, use the following steps.
98 98
99 99 1. Navigate to your |RCE| install location.
100 100 2. Run the interactive ``ishell`` prompt.
101 101 3. Set a new arguments for users.
102 102
103 103 Use the following code example to carry out these steps.
104 104
105 105 .. code-block:: bash
106 106
107 107 # starts the ishell interactive prompt
108 108 $ rccontrol ishell enterprise-1
109 109
110 .. code-block:: mysql
110 .. code-block:: python
111 111
112 112 # Use this example to change email and username of LDAP user
113 113 In [1]: my_user = User.get_by_username('some_username')
114 114 In [2]: my_user.email = 'new_email@foobar.com'
115 115 In [3]: my_user.username = 'SomeUser'
116 116 In [4]: Session().add(my_user);Session().commit()
117 117 In [5]: exit()
118 118
119 119
120 120 Change user login type
121 121 ^^^^^^^^^^^^^^^^^^^^^^
122 122
123 123 Sometimes it's required to change account type from RhodeCode to LDAP or
124 124 other external authentication type.
125 125 If you need to manually change the method of login, use the following steps.
126 126
127 127 1. Navigate to your |RCE| install location.
128 128 2. Run the interactive ``ishell`` prompt.
129 129 3. Set a new arguments for users.
130 130
131 131 Use the following code example to carry out these steps.
132 132 Available values for new_extern_type can be found when browsing available
133 133 authentication types in RhodeCode admin interface for authentication.
134 134 Use the text which is shown after '#' sign, eg.
135 135 ` LDAP (egg:rhodecode-enterprise-ce#ldap)` it's type is 'ldap'
136 136
137 137 .. code-block:: bash
138 138
139 139 # starts the ishell interactive prompt
140 140 $ rccontrol ishell enterprise-1
141 141
142 .. code-block:: mysql
142 .. code-block:: python
143 143
144 144 # Use this example to change users from authentication
145 145 # using rhodecode internal to ldap
146 146 In [1]: new_extern_type = 'ldap'
147 147 In [2]: my_user = User.get_by_username('some_username')
148 148 In [3]: my_user.extern_type = new_extern_type
149 149 In [4]: my_user.extern_name = new_extern_type
150 150 In [5]: Session().add(my_user);Session().commit()
151 151 In [6]: exit()
@@ -1,210 +1,209 b''
1 1 .. _api:
2 2
3 3 API Documentation
4 4 =================
5 5
6 6 The |RCE| API uses a single scheme for calling all API methods. The API is
7 7 implemented with JSON protocol in both directions. To send API requests to
8 8 your instance of |RCE|, use the following URL format
9 9 ``<your_server>/_admin``
10 10
11 11 .. note::
12 12
13 13 To use the API, you should configure the :file:`~/.rhoderc` file with
14 14 access details per instance. For more information, see
15 15 :ref:`config-rhoderc`.
16 16
17 17
18 18 API ACCESS FOR WEB VIEWS
19 19 ------------------------
20 20
21 21 API access can also be turned on for each web view in |RCE| that is
22 22 decorated with a `@LoginRequired` decorator. To enable API access, change
23 23 the standard login decorator to `@LoginRequired(api_access=True)`.
24 24
25 25 From |RCE| version 1.7.0 you can configure a white list
26 26 of views that have API access enabled by default. To enable these,
27 27 edit the |RCE| configuration ``.ini`` file. The default location is:
28 28
29 29 * |RCE| Pre-2.2.7 :file:`root/rhodecode/data/production.ini`
30 30 * |RCE| 3.0 :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini`
31 31
32 32 To configure the white list, edit this section of the file. In this
33 33 configuration example, API access is granted to the patch/diff raw file and
34 34 archive.
35 35
36 36 .. code-block:: ini
37 37
38 38 ## List of controllers (using glob syntax) that AUTH TOKENS could be used for access.
39 39 ## Adding ?auth_token = <token> to the url authenticates this request as if it
40 40 ## came from the the logged in user who own this authentication token.
41 41 ##
42 42 ## Syntax is <ControllerClass>:<function_pattern>.
43 43 ## The list should be "," separated and on a single line.
44 44 ##
45 45 api_access_controllers_whitelist = RepoCommitsView:repo_commit_raw,RepoCommitsView:repo_commit_patch,RepoCommitsView:repo_commit_download
46 46
47 47 After this change, a |RCE| view can be accessed without login by adding a
48 48 GET parameter ``?auth_token=<auth_token>`` to a url. For example to
49 49 access the raw diff.
50 50
51 51 .. code-block:: html
52 52
53 53 http://<server>/<repo>/changeset-diff/<sha>?auth_token=<auth_token>
54 54
55 55 By default this is only enabled on RSS/ATOM feed views. Exposing raw diffs is a
56 56 good way to integrate with 3rd party services like code review, or build farms
57 57 that could download archives.
58 58
59 59 API ACCESS
60 60 ----------
61 61
62 62 All clients are required to send JSON-RPC spec JSON data.
63 63
64 64 .. code-block:: bash
65 65
66 66 {
67 67 "id:"<id>",
68 68 "auth_token":"<auth_token>",
69 69 "method":"<method_name>",
70 70 "args":{"<arg_key>":"<arg_val>"}
71 71 }
72 72
73 73 Example call for auto pulling from remote repositories using curl:
74 74
75 75 .. code-block:: bash
76 76
77 77 curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,
78 78 "auth_token":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull", "args":{"repoid":"CPython"}}'
79 79
80 80 Provide those parameters:
81 81 - **id** A value of any type, which is used to match the response with the
82 82 request that it is replying to.
83 83 - **auth_token** for access and permission validation.
84 84 - **method** is name of method to call
85 85 - **args** is an ``key:value`` list of arguments to pass to method
86 86
87 87 .. note::
88 88
89 89 To get your |authtoken|, from the |RCE| interface,
90 90 go to:
91 91 :menuselection:`username --> My account --> Auth tokens`
92 92
93 93 For security reasons you should always create a dedicated |authtoken| for
94 94 API use only.
95 95
96 96
97 97 The |RCE| API will always return a JSON-RPC response:
98 98
99 99 .. code-block:: bash
100 100
101 101 {
102 102 "id": <id>, # matching id sent by request
103 103 "result": "<result>"|null, # JSON formatted result, null if any errors
104 104 "error": "null"|<error_message> # JSON formatted error (if any)
105 105 }
106 106
107 107 All responses from API will be with `HTTP/1.0 200 OK` status code.
108 108 If there is an error when calling the API, the *error* key will contain a
109 109 failure description and the *result* will be `null`.
110 110
111 111 API CLIENT
112 112 ----------
113 113
114 114 To install the |RCE| API, see :ref:`install-tools`. To configure the API per
115 115 instance, see the :ref:`rc-tools` section as you need to configure a
116 116 :file:`~/.rhoderc` file with your |authtokens|.
117 117
118 118 Once you have set up your instance API access, use the following examples to
119 119 get started.
120 120
121 121 .. code-block:: bash
122 122
123 123 # Getting the 'rhodecode' repository
124 124 # from a RhodeCode Enterprise instance
125 125 rhodecode-api --instance-name=enterprise-1 get_repo repoid:rhodecode
126 126
127 127 Calling method get_repo => http://127.0.0.1:5000
128 128 Server response
129 129 {
130 130 <json data>
131 131 }
132 132
133 133 # Creating a new mercurial repository called 'brand-new'
134 134 # with a description 'Repo-description'
135 135 rhodecode-api --instance-name=enterprise-1 create_repo repo_name:brand-new repo_type:hg description:Repo-description
136 136 {
137 137 "error": null,
138 138 "id": 1110,
139 139 "result": {
140 140 "msg": "Created new repository `brand-new`",
141 141 "success": true,
142 142 "task": null
143 143 }
144 144 }
145 145
146 146 A broken example, what not to do.
147 147
148 148 .. code-block:: bash
149 149
150 150 # A call missing the required arguments
151 151 # and not specifying the instance
152 152 rhodecode-api get_repo
153 153
154 154 Calling method get_repo => http://127.0.0.1:5000
155 155 Server response
156 156 "Missing non optional `repoid` arg in JSON DATA"
157 157
158 158 You can specify pure JSON using the ``--format`` parameter.
159 159
160 160 .. code-block:: bash
161 161
162 162 rhodecode-api --format=json get_repo repoid:rhodecode
163 163
164 164 In such case only output that this function shows is pure JSON, we can use that
165 165 and pipe output to some json formatter.
166 166
167 167 If output is in pure JSON format, you can pipe output to a JSON formatter.
168 168
169 169 .. code-block:: bash
170 170
171 171 rhodecode-api --instance-name=enterprise-1 --format=json get_repo repoid:rhodecode | python -m json.tool
172 172
173 173 API METHODS
174 174 -----------
175 175
176 176 Each method by default required following arguments.
177 177
178 178 .. code-block:: bash
179 179
180 180 id : "<id_for_response>"
181 181 auth_token : "<auth_token>"
182 182 method : "<method name>"
183 183 args : {}
184 184
185 185 Use each **param** from docs and put it in args, Optional parameters
186 186 are not required in args.
187 187
188 188 .. code-block:: bash
189 189
190 190 args: {"repoid": "rhodecode"}
191 191
192 192 .. Note: From this point on things are generated by the script in
193 193 `scripts/fabfile.py`. To change things below, update the docstrings in the
194 194 ApiController.
195 195
196 196 .. --- API DEFS MARKER ---
197 197 .. toctree::
198 198
199 199 methods/repo-methods
200 200 methods/store-methods
201 201 methods/license-methods
202 202 methods/deprecated-methods
203 203 methods/gist-methods
204 204 methods/pull-request-methods
205 methods/repo-methods
206 205 methods/repo-group-methods
207 206 methods/search-methods
208 207 methods/server-methods
209 208 methods/user-methods
210 209 methods/user-group-methods
@@ -1,311 +1,347 b''
1 # -*- coding: utf-8 -*-
2 #
3 # RhodeCode Enterprise documentation build configuration file, created by
4 # sphinx-quickstart on Tue Nov 4 11:48:37 2014.
5 #
6 # This file is execfile()d with the current directory set to its
7 # containing dir.
1 # Configuration file for the Sphinx documentation builder.
8 2 #
9 # Note that not all possible configuration values are present in this
10 # autogenerated file.
11 #
12 # All configuration values have a default; values that are commented out
13 # serve to show the default.
3 # For the full list of built-in configuration values, see the documentation:
4 # https://www.sphinx-doc.org/en/master/usage/configuration.html
5
6 # -- Project information -----------------------------------------------------
7 # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
14 8
9 import os
15 10 import sys
16 import os
17 11 import datetime
18 import sphinx_rtd_theme
12
13 # sphinx injects tags magically during build, we re-define it here to make linters happy
14 tags = tags # noqa
19 15
20 16 # If extensions (or modules to document with autodoc) are in another directory,
21 17 # add these directories to sys.path here. If the directory is relative to the
22 18 # documentation root, use os.path.abspath to make it absolute, like shown here.
23 sys.path.insert(0, os.path.abspath('.'))
24 import common
19 sys.path.insert(0, os.path.abspath("."))
20
21
22 def _get_version():
23 with open("../rhodecode/VERSION") as f:
24 return f.read().strip()
25
26
27 now = datetime.datetime.today()
28
29 # The full project version, used as the replacement for |release| and e.g. in the HTML templates.
30 # For example, for the Python documentation, this may be something like 2.6.0rc1.
31 # If you don’t need the separation provided between version and release, just set them both to the same value.
32 release = _get_version()
33
34 # The major project version, used as the replacement for |version|.
35 # For example, for the Python documentation, this may be something like 2.6.
36 version = ".".join(release.split(".", 2)[:2]) # First two parts of release
37
38
39 # General information about the project.
40 project = "RhodeCode Enterprise"
41 copyright = f"2010-{now.year}, RhodeCode GmbH"
42 author = "RhodeCode GmbH"
25 43
26 44 # -- General configuration ------------------------------------------------
27 45
28 46 # If your documentation needs a minimal Sphinx version, state it here.
29 #needs_sphinx = '1.0'
47 # needs_sphinx = '1.0'
30 48
31 49 # Add any Sphinx extension module names here, as strings. They can be
32 50 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
33 51 # ones.
34 52 extensions = [
35 'sphinx.ext.autodoc',
36 'sphinx.ext.intersphinx',
37 'sphinx.ext.todo',
38 'sphinx.ext.imgmath'
53 "sphinx.ext.autodoc",
54 "sphinx.ext.intersphinx",
55 "sphinx.ext.todo",
56 "sphinx.ext.imgmath",
39 57 ]
40 58
41 59 intersphinx_mapping = {
42 'enterprise': ('https://docs.rhodecode.com/RhodeCode-Enterprise/', None),
43 'control': ('https://docs.rhodecode.com/RhodeCode-Control/', None),
60 "enterprise": ("https://docs.rhodecode.com/RhodeCode-Enterprise/", None),
61 "rcstack": ("https://docs.rhodecode.com/rcstack/", None),
62 "control": ("https://docs.rhodecode.com/RhodeCode-Control/", None),
44 63 }
45 64
46 65 # Add any paths that contain templates here, relative to this directory.
47 templates_path = ['_templates']
66 templates_path = ["_templates"]
48 67
49 68 # The suffix of source filenames.
50 source_suffix = '.rst'
69 source_suffix = ".rst"
51 70
52 71 # The encoding of source files.
53 #source_encoding = 'utf-8-sig'
72 # source_encoding = 'utf-8-sig'
54 73
55 74 # The master toctree document.
56 master_doc = 'index'
75 master_doc = "index"
57 76
58 77 # The version info for the project you're documenting, acts as replacement for
59 78 # |version| and |release|, also used in various other places throughout the
60 79 # built documents.
61 80
62 81
63 def _get_version():
64 with open('../rhodecode/VERSION') as f:
65 return f.read().strip()
66
67
68 # The full version, including alpha/beta/rc tags.
69 release = _get_version()
70 # The short X.Y version.
71 version = '.'.join(release.split('.', 2)[:2]) # First two parts of release
72
73 # General information about the project.
74 project = u'RhodeCode Enterprise %s ' % _get_version()
75 copyright = u'2010-{now.year}, RhodeCode GmbH'.format(
76 now=datetime.datetime.today())
77
78
79 82 # The language for content autogenerated by Sphinx. Refer to documentation
80 83 # for a list of supported languages.
81 #language = None
84 # language = None
82 85
83 rst_epilog = common.rst_epilog + """
86 rst_epilog = """
84 87 .. |async| replace:: asynchronous
88 .. |AE| replace:: Appenlight
89 .. |authtoken| replace:: Authentication Token
90 .. |authtokens| replace:: **Auth Tokens**
91 .. |RCCEshort| replace:: Community
92 .. |RCEEshort| replace:: Enterprise
93 .. |git| replace:: Git
94 .. |hg| replace:: Mercurial
95 .. |svn| replace:: Subversion
96 .. |LDAP| replace:: LDAP / Active Directory
97 .. |os| replace:: operating system
98 .. |OS| replace:: Operating System
99 .. |PY| replace:: Python
100 .. |pr| replace:: pull request
101 .. |prs| replace:: pull requests
102 .. |psf| replace:: Python Software Foundation
103 .. |repo| replace:: repository
104 .. |repos| replace:: repositories
105 .. |RCC| replace:: RhodeCode Control
106 .. |RCE| replace:: RhodeCode Enterprise
107 .. |RCCE| replace:: RhodeCode Community
108 .. |RCEE| replace:: RhodeCode Enterprise
109 .. |RCX| replace:: RhodeCode Extensions
110 .. |RCT| replace:: RhodeCode Tools
111 .. |RCEBOLD| replace:: **RhodeCode Enterprise**
112 .. |RCEITALICS| replace:: `RhodeCode Enterprise`
113 .. |RNS| replace:: Release Notes
85 114 """
86 115
87 116 # There are two options for replacing |today|: either, you set today to some
88 117 # non-false value, then it is used:
89 #today = ''
118 # today = ''
90 119 # Else, today_fmt is used as the format for a strftime call.
91 #today_fmt = '%B %d, %Y'
120 # today_fmt = '%B %d, %Y'
92 121
93 122 # List of patterns, relative to source directory, that match files and
94 123 # directories to ignore when looking for source files.
95 124 exclude_patterns = [
96 125 # Special directories
97 '_build',
98 'result',
99
126 "_build",
127 "result",
100 128 # Other RST files
101 'admin/rhodecode-backup.rst',
102 'issue-trackers/redmine.rst',
103 'known-issues/error-msg-guide.rst',
104 'tutorials/docs-build.rst',
105 'integrations/example-ext.py',
106 'collaboration/supported-workflows.rst',
129 "admin/rhodecode-backup.rst",
130 "issue-trackers/redmine.rst",
131 "known-issues/error-msg-guide.rst",
132 "tutorials/docs-build.rst",
133 "integrations/example-ext.py",
134 "collaboration/supported-workflows.rst",
107 135 ]
108 136
109 137
110 138 # The reST default role (used for this markup: `text`) to use for all
111 139 # documents.
112 #default_role = None
140 # default_role = None
113 141
114 142 # If true, '()' will be appended to :func: etc. cross-reference text.
115 #add_function_parentheses = True
143 # add_function_parentheses = True
116 144
117 145 # If true, the current module name will be prepended to all description
118 146 # unit titles (such as .. function::).
119 #add_module_names = True
147 # add_module_names = True
120 148
121 149 # If true, sectionauthor and moduleauthor directives will be shown in the
122 150 # output. They are ignored by default.
123 #show_authors = False
151 # show_authors = False
124 152
125 153 # The name of the Pygments (syntax highlighting) style to use.
126 pygments_style = 'sphinx'
154 pygments_style = "sphinx"
127 155
128 156 # A list of ignored prefixes for module index sorting.
129 #modindex_common_prefix = []
157 # modindex_common_prefix = []
130 158
131 159 # If true, keep warnings as "system message" paragraphs in the built documents.
132 160 keep_warnings = tags.has("dev")
133 161
134 162
135 163 # -- Options for HTML output ----------------------------------------------
136 164
137 165 # The theme to use for HTML and HTML Help pages. See the documentation for
138 166 # a list of builtin themes.
139 #html_theme = 'rctheme'
140 html_theme = 'sphinx_rtd_theme'
167 html_theme = "furo"
141 168
142 169 # Theme options are theme-specific and customize the look and feel of a theme
143 170 # further. For a list of options available for each theme, see the
144 171 # documentation.
145 #html_theme_options = {}
146 html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
172 # html_theme_options = {}
173
147 174
148 175 # Add any paths that contain custom themes here, relative to this directory.
149 #html_theme_path = []
176 # html_theme_path = []
150 177
151 178 # The name for this set of Sphinx documents. If None, it defaults to
152 179 # "<project> v<release> documentation".
153 #html_title = None
180 # html_title = None
154 181
155 182 # A shorter title for the navigation bar. Default is the same as html_title.
156 #html_short_title = None
183 # html_short_title = None
157 184
158 185 # The name of an image file (relative to this directory) to place at the top
159 186 # of the sidebar.
160 #html_logo = None
161 html_sidebars = {
162 '**': ['globaltoc.html'],
163 }
187 # html_logo = None
188
189
190 #html_sidebars = {
191 # "**": ["globaltoc.html"],
192 #}
164 193
165 194 # The name of an image file (within the static path) to use as favicon of the
166 195 # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
167 196 # pixels large.
168 html_favicon = 'images/favicon.ico'
197 html_favicon = "images/favicon.ico"
169 198
170 199 # Add any paths that contain custom static files (such as style sheets) here,
171 200 # relative to this directory. They are copied after the builtin static files,
172 201 # so a file named "default.css" will overwrite the builtin "default.css".
173 html_static_path = ['static/css/add.css']
202 html_static_path = ["static/css/add.css"]
174 203
175 204 # Add any extra paths that contain custom files (such as robots.txt or
176 205 # .htaccess) here, relative to this directory. These files are copied
177 206 # directly to the root of the documentation.
178 #html_extra_path = []
207 # html_extra_path = []
179 208
180 209 # If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
181 210 # using the given strftime format.
182 #html_last_updated_fmt = '%b %d, %Y'
211 html_last_updated_fmt = " %H:%m %b %d, %Y"
183 212
184 213 # If true, SmartyPants will be used to convert quotes and dashes to
185 214 # typographically correct entities.
186 #html_use_smartypants = True
215 # html_use_smartypants = True
187 216
188 217 # Custom sidebar templates, maps document names to template names.
189 #html_sidebars = {}
218 # html_sidebars = {}
190 219
191 220 # Additional templates that should be rendered to pages, maps page names to
192 221 # template names.
193 #html_additional_pages = {}
222 # html_additional_pages = {}
194 223
195 224 # If false, no module index is generated.
196 #html_domain_indices = True
225 # html_domain_indices = True
197 226
198 227 # If false, no index is generated.
199 #html_use_index = True
228 # html_use_index = True
200 229
201 230 # If true, the index is split into individual pages for each letter.
202 #html_split_index = False
231 # html_split_index = False
203 232
204 233 # If true, links to the reST sources are added to the pages.
205 #html_show_sourcelink = True
234 # html_show_sourcelink = True
206 235
207 236 # If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
208 #html_show_sphinx = True
237 html_show_sphinx = False
209 238
210 239 # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
211 #html_show_copyright = True
240 # html_show_copyright = True
212 241
213 242 # If true, an OpenSearch description file will be output, and all pages will
214 243 # contain a <link> tag referring to it. The value of this option must be the
215 244 # base URL from which the finished HTML is served.
216 #html_use_opensearch = ''
245 # html_use_opensearch = ''
217 246
218 247 # This is the file name suffix for HTML files (e.g. ".xhtml").
219 #html_file_suffix = None
248 # html_file_suffix = None
220 249
221 250 # Output file base name for HTML help builder.
222 htmlhelp_basename = 'rhodecode-enterprise'
251 htmlhelp_basename = "rhodecode-enterprise"
223 252
224 253
225 254 # -- Options for LaTeX output ---------------------------------------------
226 255
227 256 latex_elements = {
228 'classoptions': ',oneside',
229 'babel': '\\usepackage[english]{babel}',
230
231 # The paper size ('letterpaper' or 'a4paper').
232 #'papersize': 'letterpaper',
233
234 # The font size ('10pt', '11pt' or '12pt').
235 #'pointsize': '10pt',
236
237 # Additional stuff for the LaTeX preamble.
238 #'preamble': '',
257 "classoptions": ",oneside",
258 "babel": "\\usepackage[english]{babel}",
259 # The paper size ('letterpaper' or 'a4paper').
260 #'papersize': 'letterpaper',
261 # The font size ('10pt', '11pt' or '12pt').
262 #'pointsize': '10pt',
263 # Additional stuff for the LaTeX preamble.
264 #'preamble': '',
239 265 }
240 266
241 267 # Grouping the document tree into LaTeX files. List of tuples
242 268 # (source start file, target name, title,
243 269 # author, documentclass [howto, manual, or own class]).
244 270 latex_documents = [
245 ('index', 'RhodeCodeEnterprise.tex', u'RhodeCode Enterprise',
246 u'RhodeCode GmbH', 'manual'),
271 (
272 "index",
273 "RhodeCodeEnterprise.tex",
274 "RhodeCode Enterprise",
275 "RhodeCode GmbH",
276 "manual",
277 ),
247 278 ]
248 279
249 280 # The name of an image file (relative to this directory) to place at the top of
250 281 # the title page.
251 #latex_logo = None
282 # latex_logo = None
252 283
253 284 # For "manual" documents, if this is true, then toplevel headings are parts,
254 285 # not chapters.
255 #latex_use_parts = False
286 # latex_use_parts = False
256 287
257 288 # If true, show page references after internal links.
258 289 latex_show_pagerefs = True
259 290
260 291 # If true, show URL addresses after external links.
261 latex_show_urls = 'footnote'
292 latex_show_urls = "footnote"
262 293
263 294 # Documents to append as an appendix to all manuals.
264 #latex_appendices = []
295 # latex_appendices = []
265 296
266 297 # If false, no module index is generated.
267 #latex_domain_indices = True
298 # latex_domain_indices = True
268 299
269 300 # Mode for literal blocks wider than the frame. Can be
270 301 # overflow, shrink or truncate
271 302 pdf_fit_mode = "truncate"
272 303
273 304
274 305 # -- Options for manual page output ---------------------------------------
275 306
276 307 # One entry per manual page. List of tuples
277 308 # (source start file, name, description, authors, manual section).
278 309 man_pages = [
279 ('index', 'rhodecodeenterprise', u'RhodeCode Enterprise',
280 [u'RhodeCode GmbH'], 1)
310 ("index", "rhodecodeenterprise", "RhodeCode Enterprise", ["RhodeCode GmbH"], 1)
281 311 ]
282 312
283 313 # If true, show URL addresses after external links.
284 #man_show_urls = False
314 # man_show_urls = False
285 315
286 316
287 317 # -- Options for Texinfo output -------------------------------------------
288 318
289 319 # Grouping the document tree into Texinfo files. List of tuples
290 320 # (source start file, target name, title, author,
291 321 # dir menu entry, description, category)
292 322 texinfo_documents = [
293 ('index', 'RhodeCodeEnterprise', u'RhodeCode Enterprise',
294 u'RhodeCode Docs Team', 'RhodeCodeEnterprise', 'RhodeCode Docs Project',
295 'Miscellaneous'),
323 (
324 "index",
325 "RhodeCodeEnterprise",
326 "RhodeCode Enterprise",
327 "RhodeCode Docs Team",
328 "RhodeCodeEnterprise",
329 "RhodeCode Docs Project",
330 "Miscellaneous",
331 ),
296 332 ]
297 333
298 334 # Documents to append as an appendix to all manuals.
299 #texinfo_appendices = []
335 # texinfo_appendices = []
300 336
301 337 # If false, no module index is generated.
302 #texinfo_domain_indices = True
338 # texinfo_domain_indices = True
303 339
304 340 # How to display URL addresses: 'footnote', 'no', or 'inline'.
305 #texinfo_show_urls = 'footnote'
341 # texinfo_show_urls = 'footnote'
306 342
307 343 # If true, do not generate a @detailmenu in the "Top" node's menu.
308 #texinfo_no_detailmenu = False
344 # texinfo_no_detailmenu = False
309 345
310 346 # We want to see todo notes in case of a pre-release build of the documentation
311 347 todo_include_todos = tags.has("dev")
@@ -1,85 +1,85 b''
1 1
2 2 .. _config-celery:
3 3
4 4 Configure Celery
5 5 ----------------
6 6
7 7 Celery_ is an asynchronous task queue. It's a part of RhodeCode scheduler
8 8 functionality. Celery_ makes certain heavy tasks perform more efficiently.
9 9 Most important it allows sending notification emails, create repository forks,
10 10 and import repositories in async way. It is also used for bi-directional
11 11 repository sync in scheduler.
12 12
13 13 If you decide to use Celery you also need a working message queue.
14 14 There are two fully supported message brokers is rabbitmq_ and redis_ (recommended).
15 15
16 16 Since release 4.18.X we recommend using redis_ as a backend since it's generally
17 17 easier to work with, and results in simpler stack as redis is generally recommended
18 18 for caching purposes.
19 19
20 20
21 21 In order to install and configure Celery, follow these steps:
22 22
23 23 1. Install RabbitMQ or Redis for a message queue, see the documentation on the Celery website for
24 24 `redis installation`_ or `rabbitmq installation`_
25 25
26 26
27 27 1a. If you choose RabbitMQ example configuration after installation would look like that::
28 28
29 29 sudo rabbitmqctl add_user rcuser secret_password
30 30 sudo rabbitmqctl add_vhost rhodevhost
31 31 sudo rabbitmqctl set_user_tags rcuser rhodecode
32 32 sudo rabbitmqctl set_permissions -p rhodevhost rcuser ".*" ".*" ".*"
33 33
34 34
35 35 2. Enable celery, and install `celery worker` process script using the `enable-module`::
36 36
37 37 rccontrol enable-module celery {instance-id}
38 38
39 39 .. note::
40 40
41 41 In case when using multiple instances in one or multiple servers it's highly
42 42 recommended that celery is running only once, for all servers connected to
43 43 the same database. Having multiple celery instances running without special
44 44 reconfiguration could cause scheduler issues.
45 45
46 46
47 47 3. Configure Celery in the
48 48 :file:`home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
49 49 Set the broker_url as minimal settings required to enable operation.
50 50 If used our example data from pt 1a, here is how the broker url should look like::
51 51
52 52 # for Redis
53 53 celery.broker_url = redis://localhost:6379/8
54 54
55 55 # for RabbitMQ
56 56 celery.broker_url = amqp://rcuser:secret_password@localhost:5672/rhodevhost
57 57
58 58 Full configuration example is below:
59 59
60 60 .. code-block:: ini
61 61
62 62 # Set this section of the ini file to match your Celery installation
63 63 ####################################
64 64 ### CELERY CONFIG ####
65 65 ####################################
66 66
67 67 use_celery = true
68 68 celery.broker_url = redis://localhost:6379/8
69 69
70 70 # maximum tasks to execute before worker restart
71 celery.max_tasks_per_child = 100
71 celery.max_tasks_per_child = 20
72 72
73 73 ## tasks will never be sent to the queue, but executed locally instead.
74 74 celery.task_always_eager = false
75 75
76 76
77 77 .. _python: http://www.python.org/
78 78 .. _mercurial: http://mercurial.selenic.com/
79 79 .. _celery: http://celeryproject.org/
80 80 .. _redis: http://redis.io
81 81 .. _redis installation: https://redis.io/topics/quickstart
82 82 .. _rabbitmq: http://www.rabbitmq.com/
83 83 .. _rabbitmq installation: http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html
84 84 .. _rabbitmq website installation: http://www.rabbitmq.com/download.html
85 85 .. _Celery installation: http://docs.celeryproject.org/en/latest/getting-started/introduction.html#bundles
@@ -1,60 +1,58 b''
1 1 .. _integrations:
2 2
3 3 Integrations
4 4 ------------
5 5
6 6 |RCE| supports integrations with external services for various events,
7 7 such as commit pushes and pull requests. Multiple integrations of the same type
8 8 can be added at the same time; this is useful for posting different events to
9 9 different Slack channels, for example.
10 10
11 11 Supported integrations
12 12 ^^^^^^^^^^^^^^^^^^^^^^
13 13
14 14 ================================ ================== ========================================
15 15 Type/Name RhodeCode Edition Description
16 16 ================================ ================== ========================================
17 17 :ref:`integrations-webhook` |RCCEshort| Trigger events as `json` to a custom url
18 18 :ref:`integrations-slack` |RCCEshort| Integrate with https://slack.com/
19 :ref:`integrations-hipchat` |RCCEshort| Integrate with https://www.hipchat.com/
20 19 :ref:`integrations-email` |RCCEshort| Send repo push commits by email
21 20 :ref:`integrations-ci` |RCCEshort| Trigger Builds for Common CI Systems
22 21 :ref:`integrations-rcextensions` |RCCEshort| Advanced low-level integration framework
23 22
24 23 :ref:`integrations-jenkins` |RCEEshort| Trigger Builds for Jenkins CI System
25 24 :ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference Redmine issues
26 25 :ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues
27 26 ================================ ================== ========================================
28 27
29 28 .. _creating-integrations:
30 29
31 30 Creating an Integration
32 31 ^^^^^^^^^^^^^^^^^^^^^^^
33 32
34 33 Integrations can be added globally via the admin UI:
35 34
36 35 :menuselection:`Admin --> Integrations`
37 36
38 37 or per repository in each repository's settings:
39 38
40 39 :menuselection:`Admin --> Repositories --> Edit --> Integrations`
41 40
42 41 To create an integration, select the type from the list in the *Create New
43 42 Integration* section.
44 43
45 44 The *Current Integrations* section shows existing integrations that have been
46 45 created along with their type (eg. Slack) and enabled status.
47 46
48 47 See pages specific to each type of integration for more instructions:
49 48
50 49 .. toctree::
51 50
52 51 slack
53 hipchat
54 52 redmine
55 53 jira
56 54 webhook
57 55 email
58 56 ci
59 57 jenkins
60 58 integrations-rcextensions
@@ -1,8 +1,11 b''
1 sphinx==1.8.2
2 six==1.11.0
3 sphinx_rtd_theme==0.4.1
4 docutils==0.16.0
5 pygments==2.3.0
6 markupsafe==1.0.0
7 jinja2==2.9.6
8 pytz==2018.4
1 sphinx==7.2.6
2
3 furo==2023.9.10
4 sphinx-press-theme==0.8.0
5 sphinx-rtd-theme==1.3.0
6
7 pygments==2.16.1
8
9 docutils<0.19
10 markupsafe==2.1.3
11 jinja2==3.1.2
@@ -1,187 +1,186 b''
1 1 {
2 2 "dirs": {
3 3 "css": {
4 4 "src": "rhodecode/public/css",
5 5 "dest": "rhodecode/public/css"
6 6 },
7 7 "js": {
8 8 "src": "rhodecode/public/js/src",
9 9 "src_rc": "rhodecode/public/js/rhodecode",
10 10 "dest": "rhodecode/public/js",
11 11 "node_modules": "node_modules"
12 12 }
13 13 },
14 14 "copy": {
15 15 "main": {
16 16 "files": [
17 17 {
18 18 "expand": true,
19 19 "cwd": "node_modules/@webcomponents",
20 20 "src": "webcomponentsjs/*.*",
21 21 "dest": "<%= dirs.js.dest %>/vendors"
22 22 },
23 23 {
24 24 "src": "<%= dirs.css.src %>/style-polymer.css",
25 25 "dest": "<%= dirs.js.dest %>/src/components/style-polymer.css"
26 26 }
27 27 ]
28 28 }
29 29 },
30 30 "concat": {
31 31 "dist": {
32 32 "src": [
33 33 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
34 34 "<%= dirs.js.node_modules %>/mousetrap/mousetrap.min.js",
35 35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
36 36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
37 37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
38 38 "<%= dirs.js.node_modules %>/dropzone/dist/min/dropzone.min.js",
39 39 "<%= dirs.js.node_modules %>/sweetalert2/dist/sweetalert2.min.js",
40 40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
41 41 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
42 42 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
43 43 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
44 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
45 44 "<%= dirs.js.src %>/logging.js",
46 45 "<%= dirs.js.src %>/bootstrap.js",
47 46 "<%= dirs.js.src %>/i18n_utils.js",
48 47 "<%= dirs.js.src %>/deform.js",
49 48 "<%= dirs.js.src %>/ejs.js",
50 49 "<%= dirs.js.src %>/ejs_templates/utils.js",
51 50 "<%= dirs.js.src %>/plugins/jquery.pjax.js",
52 51 "<%= dirs.js.src %>/plugins/jquery.dataTables.js",
53 52 "<%= dirs.js.src %>/plugins/flavoured_checkbox.js",
54 53 "<%= dirs.js.src %>/plugins/within_viewport.js",
55 54 "<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js",
56 55 "<%= dirs.js.src %>/plugins/jquery.autocomplete.js",
57 56 "<%= dirs.js.src %>/plugins/jquery.debounce.js",
58 57 "<%= dirs.js.src %>/plugins/jquery.scrollstop.js",
59 58 "<%= dirs.js.src %>/plugins/jquery.within-viewport.js",
60 59 "<%= dirs.js.node_modules %>/mark.js/dist/jquery.mark.min.js",
61 60 "<%= dirs.js.src %>/plugins/jquery.timeago.js",
62 61 "<%= dirs.js.src %>/plugins/jquery.timeago-extension.js",
63 62 "<%= dirs.js.src %>/select2/select2.js",
64 63 "<%= dirs.js.src %>/codemirror/codemirror.js",
65 64 "<%= dirs.js.src %>/codemirror/codemirror_loadmode.js",
66 65 "<%= dirs.js.src %>/codemirror/codemirror_hint.js",
67 66 "<%= dirs.js.src %>/codemirror/codemirror_overlay.js",
68 67 "<%= dirs.js.src %>/codemirror/codemirror_placeholder.js",
69 68 "<%= dirs.js.src %>/codemirror/codemirror_simplemode.js",
70 69 "<%= dirs.js.dest %>/mode/meta.js",
71 70 "<%= dirs.js.dest %>/mode/meta_ext.js",
72 71 "<%= dirs.js.src_rc %>/i18n/select2/translations.js",
73 72 "<%= dirs.js.src %>/rhodecode/utils/array.js",
74 73 "<%= dirs.js.src %>/rhodecode/utils/string.js",
75 74 "<%= dirs.js.src %>/rhodecode/utils/pyroutes.js",
76 75 "<%= dirs.js.src %>/rhodecode/utils/ajax.js",
77 76 "<%= dirs.js.src %>/rhodecode/utils/autocomplete.js",
78 77 "<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js",
79 78 "<%= dirs.js.src %>/rhodecode/utils/ie.js",
80 79 "<%= dirs.js.src %>/rhodecode/utils/os.js",
81 80 "<%= dirs.js.src %>/rhodecode/utils/topics.js",
82 81 "<%= dirs.js.src %>/rhodecode/init.js",
83 82 "<%= dirs.js.src %>/rhodecode/changelog.js",
84 83 "<%= dirs.js.src %>/rhodecode/codemirror.js",
85 84 "<%= dirs.js.src %>/rhodecode/comments.js",
86 85 "<%= dirs.js.src %>/rhodecode/constants.js",
87 86 "<%= dirs.js.src %>/rhodecode/files.js",
88 87 "<%= dirs.js.src %>/rhodecode/followers.js",
89 88 "<%= dirs.js.src %>/rhodecode/menus.js",
90 89 "<%= dirs.js.src %>/rhodecode/notifications.js",
91 90 "<%= dirs.js.src %>/rhodecode/permissions.js",
92 91 "<%= dirs.js.src %>/rhodecode/pjax.js",
93 92 "<%= dirs.js.src %>/rhodecode/pullrequests.js",
94 93 "<%= dirs.js.src %>/rhodecode/settings.js",
95 94 "<%= dirs.js.src %>/rhodecode/select2_widgets.js",
96 95 "<%= dirs.js.src %>/rhodecode/tooltips.js",
97 96 "<%= dirs.js.src %>/rhodecode/users.js",
98 97 "<%= dirs.js.src %>/rhodecode/appenlight.js",
99 98 "<%= dirs.js.src %>/rhodecode.js",
100 99 "<%= dirs.js.dest %>/rhodecode-components.js"
101 100 ],
102 101 "dest": "<%= dirs.js.dest %>/scripts.js",
103 102 "nonull": true
104 103 }
105 104 },
106 105 "uglify": {
107 106 "dist": {
108 107 "src": "<%= dirs.js.dest %>/scripts.js",
109 108 "dest": "<%= dirs.js.dest %>/scripts.min.js"
110 109 }
111 110 },
112 111 "less": {
113 112 "development": {
114 113 "options": {
115 114 "compress": false,
116 115 "yuicompress": false,
117 116 "optimization": 0
118 117 },
119 118 "files": {
120 119 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
121 120 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
122 121 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
123 122 }
124 123 },
125 124 "production": {
126 125 "options": {
127 126 "compress": true,
128 127 "yuicompress": true,
129 128 "optimization": 2
130 129 },
131 130 "files": {
132 131 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
133 132 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less",
134 133 "<%= dirs.css.dest %>/style-ipython.css": "<%= dirs.css.src %>/ipython.less"
135 134 }
136 135 },
137 136 "components": {
138 137 "files": [
139 138 {
140 139 "cwd": "<%= dirs.js.src %>/components/",
141 140 "dest": "<%= dirs.js.src %>/components/",
142 141 "src": [
143 142 "**/*.less"
144 143 ],
145 144 "expand": true,
146 145 "ext": ".css"
147 146 }
148 147 ]
149 148 }
150 149 },
151 150 "watch": {
152 151 "less": {
153 152 "files": [
154 153 "<%= dirs.css.src %>/**/*.less",
155 154 "<%= dirs.js.src %>/components/**/*.less"
156 155 ],
157 156 "tasks": [
158 157 "less:development",
159 158 "less:components",
160 159 "concat:polymercss",
161 160 "webpack",
162 161 "concat:dist"
163 162 ]
164 163 },
165 164 "js": {
166 165 "files": [
167 166 "!<%= dirs.js.src %>/components/root-styles.gen.html",
168 167 "<%= dirs.js.src %>/**/*.js",
169 168 "<%= dirs.js.src %>/components/**/*.html"
170 169 ],
171 170 "tasks": [
172 171 "less:components",
173 172 "concat:polymercss",
174 173 "webpack",
175 174 "concat:dist"
176 175 ]
177 176 }
178 177 },
179 178 "jshint": {
180 179 "rhodecode": {
181 180 "src": "<%= dirs.js.src %>/rhodecode/**/*.js",
182 181 "options": {
183 182 "jshintrc": ".jshintrc"
184 183 }
185 184 }
186 185 }
187 186 }
@@ -1,62 +1,61 b''
1 1 {
2 2 "name": "rhodecode-enterprise",
3 "version": "2.0.0",
3 "version": "5.0.0",
4 4 "private": true,
5 "description" : "RhodeCode JS packaged",
5 "description": "RhodeCode JS packaged",
6 6 "license": "SEE LICENSE IN LICENSE.txt",
7 "repository" : {
8 "type" : "hg",
9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
7 "repository": {
8 "type": "hg",
9 "url": "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 10 },
11 11 "devDependencies": {
12 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1",
12 "@polymer/iron-a11y-keys": "^3.0.0",
13 "@polymer/iron-ajax": "^3.0.0",
14 "@polymer/iron-autogrow-textarea": "^3.0.0",
15 "@polymer/paper-button": "^3.0.0",
16 "@polymer/paper-spinner": "^3.0.0",
17 "@polymer/paper-toast": "^3.0.0",
18 "@polymer/paper-toggle-button": "^3.0.0",
19 "@polymer/paper-tooltip": "^3.0.0",
20 "@polymer/polymer": "^3.0.0",
21 "@webcomponents/webcomponentsjs": "^2.0.0",
22 "babel-core": "^6.26.3",
23 "babel-loader": "^7.1.2",
24 "babel-plugin-transform-object-rest-spread": "^6.26.0",
25 "babel-preset-env": "^1.6.0",
13 26 "clipboard": "^2.0.1",
27 "copy-webpack-plugin": "^4.4.2",
28 "css-loader": "^0.28.11",
29 "dropzone": "^5.5.0",
14 30 "exports-loader": "^0.6.4",
15 31 "favico.js": "^0.3.10",
16 "dropzone": "^5.5.0",
17 32 "grunt": "^0.4.5",
18 "grunt-cli": "^1.3.1",
33 "grunt-cli": "^1.4.3",
19 34 "grunt-contrib-concat": "^0.5.1",
20 35 "grunt-contrib-copy": "^1.0.0",
21 36 "grunt-contrib-jshint": "^0.12.0",
22 37 "grunt-contrib-less": "^1.1.0",
38 "grunt-contrib-uglify": "^4.0.1",
23 39 "grunt-contrib-watch": "^0.6.1",
24 40 "grunt-webpack": "^3.1.3",
25 "grunt-contrib-uglify": "^4.0.1",
26 "sweetalert2": "^9.10.12",
41 "html-loader": "^0.4.4",
42 "html-webpack-plugin": "^3.2.0",
43 "imports-loader": "^0.7.1",
27 44 "jquery": "1.11.3",
45 "jshint": "^2.9.1-rc3",
28 46 "mark.js": "8.11.1",
29 "jshint": "^2.9.1-rc3",
30 47 "moment": "^2.18.1",
31 48 "mousetrap": "^1.6.1",
49 "polymer-webpack-loader": "^2.0.1",
32 50 "qrious": "^4.0.2",
51 "raw-loader": "1.0.0-beta.0",
33 52 "sticky-sidebar": "3.3.1",
53 "style-loader": "^0.21.0",
54 "sweetalert2": "^9.10.12",
55 "ts-loader": "^1.3.3",
34 56 "waypoints": "4.0.1",
35 57 "webpack": "4.23.1",
36 58 "webpack-cli": "3.1.2",
37 "babel-core": "^6.26.3",
38 "babel-loader": "^7.1.2",
39 "babel-plugin-transform-object-rest-spread": "^6.26.0",
40 "babel-preset-env": "^1.6.0",
41 "copy-webpack-plugin": "^4.4.2",
42 "css-loader": "^0.28.11",
43 "html-loader": "^0.4.4",
44 "html-webpack-plugin": "^3.2.0",
45 "imports-loader": "^0.7.1",
46 "polymer-webpack-loader": "^2.0.1",
47 "style-loader": "^0.21.0",
48 "webpack-uglify-js-plugin": "^1.1.9",
49 "raw-loader": "1.0.0-beta.0",
50 "ts-loader": "^1.3.3",
51 "@webcomponents/webcomponentsjs": "^2.0.0",
52 "@polymer/polymer": "^3.0.0",
53 "@polymer/paper-button": "^3.0.0",
54 "@polymer/paper-spinner": "^3.0.0",
55 "@polymer/paper-tooltip": "^3.0.0",
56 "@polymer/paper-toast": "^3.0.0",
57 "@polymer/paper-toggle-button": "^3.0.0",
58 "@polymer/iron-ajax": "^3.0.0",
59 "@polymer/iron-autogrow-textarea": "^3.0.0",
60 "@polymer/iron-a11y-keys": "^3.0.0"
59 "webpack-uglify-js-plugin": "^1.1.9"
61 60 }
62 61 }
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/lib/bleach_whitelist.py to rhodecode/lib/html_sanitizer_defs.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/templates/admin/settings/settings_automation.mako to rhodecode/templates/admin/automation/automation.mako
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/tests/pylons_plugin.py to rhodecode/tests/fixture_mods/fixture_pyramid.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/tests/plugin.py to rhodecode/tests/fixture_mods/fixture_utils.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (542 lines changed) Show them Hide them
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now