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

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

@@ -0,0 +1,3 b''
1 [pip2nix]
2 requirements = -r ./requirements_docs.txt
3 output = ./python-packages-generated.nix
@@ -0,0 +1,221 b''
1 # Generated by pip2nix 0.8.0.dev1
2 # See https://github.com/johbo/pip2nix
3
4 { pkgs, fetchurl, fetchgit, fetchhg }:
5
6 self: super: {
7 "alabaster" = super.buildPythonPackage {
8 name = "alabaster-0.7.11";
9 doCheck = false;
10 src = fetchurl {
11 url = "https://files.pythonhosted.org/packages/3f/46/9346ea429931d80244ab7f11c4fce83671df0b7ae5a60247a2b588592c46/alabaster-0.7.11.tar.gz";
12 sha256 = "1mvm69xsn5xf1jc45kdq1mn0yq0pfn54mv2jcww4s1vwqx6iyfxn";
13 };
14 };
15 "babel" = super.buildPythonPackage {
16 name = "babel-2.6.0";
17 doCheck = false;
18 propagatedBuildInputs = [
19 self."pytz"
20 ];
21 src = fetchurl {
22 url = "https://files.pythonhosted.org/packages/be/cc/9c981b249a455fa0c76338966325fc70b7265521bad641bf2932f77712f4/Babel-2.6.0.tar.gz";
23 sha256 = "08rxmbx2s4irp0w0gmn498vns5xy0fagm0fg33xa772jiks51flc";
24 };
25 };
26 "certifi" = super.buildPythonPackage {
27 name = "certifi-2018.8.24";
28 doCheck = false;
29 src = fetchurl {
30 url = "https://files.pythonhosted.org/packages/e1/0f/f8d5e939184547b3bdc6128551b831a62832713aa98c2ccdf8c47ecc7f17/certifi-2018.8.24.tar.gz";
31 sha256 = "0f0nhrj9mlrf79iway4578wrsgmjh0fmacl9zv8zjckdy7b90rip";
32 };
33 };
34 "chardet" = super.buildPythonPackage {
35 name = "chardet-3.0.4";
36 doCheck = false;
37 src = fetchurl {
38 url = "https://files.pythonhosted.org/packages/fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d/chardet-3.0.4.tar.gz";
39 sha256 = "1bpalpia6r5x1kknbk11p1fzph56fmmnp405ds8icksd3knr5aw4";
40 };
41 };
42 "docutils" = super.buildPythonPackage {
43 name = "docutils-0.14";
44 doCheck = false;
45 src = fetchurl {
46 url = "https://files.pythonhosted.org/packages/84/f4/5771e41fdf52aabebbadecc9381d11dea0fa34e4759b4071244fa094804c/docutils-0.14.tar.gz";
47 sha256 = "0x22fs3pdmr42kvz6c654756wja305qv6cx1zbhwlagvxgr4xrji";
48 };
49 };
50 "idna" = super.buildPythonPackage {
51 name = "idna-2.7";
52 doCheck = false;
53 src = fetchurl {
54 url = "https://files.pythonhosted.org/packages/65/c4/80f97e9c9628f3cac9b98bfca0402ede54e0563b56482e3e6e45c43c4935/idna-2.7.tar.gz";
55 sha256 = "05jam7d31767dr12x0rbvvs8lxnpb1mhdb2zdlfxgh83z6k3hjk8";
56 };
57 };
58 "imagesize" = super.buildPythonPackage {
59 name = "imagesize-1.1.0";
60 doCheck = false;
61 src = fetchurl {
62 url = "https://files.pythonhosted.org/packages/41/f5/3cf63735d54aa9974e544aa25858d8f9670ac5b4da51020bbfc6aaade741/imagesize-1.1.0.tar.gz";
63 sha256 = "1dg3wn7qpwmhgqc0r9na2ding1wif9q5spz3j9zn2riwphc2k0zk";
64 };
65 };
66 "jinja2" = super.buildPythonPackage {
67 name = "jinja2-2.9.6";
68 doCheck = false;
69 propagatedBuildInputs = [
70 self."markupsafe"
71 ];
72 src = fetchurl {
73 url = "https://files.pythonhosted.org/packages/90/61/f820ff0076a2599dd39406dcb858ecb239438c02ce706c8e91131ab9c7f1/Jinja2-2.9.6.tar.gz";
74 sha256 = "1zzrkywhziqffrzks14kzixz7nd4yh2vc0fb04a68vfd2ai03anx";
75 };
76 };
77 "markupsafe" = super.buildPythonPackage {
78 name = "markupsafe-1.0";
79 doCheck = false;
80 src = fetchurl {
81 url = "https://files.pythonhosted.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz";
82 sha256 = "0rdn1s8x9ni7ss8rfiacj7x1085lx8mh2zdwqslnw8xc3l4nkgm6";
83 };
84 };
85 "packaging" = super.buildPythonPackage {
86 name = "packaging-17.1";
87 doCheck = false;
88 propagatedBuildInputs = [
89 self."pyparsing"
90 self."six"
91 ];
92 src = fetchurl {
93 url = "https://files.pythonhosted.org/packages/77/32/439f47be99809c12ef2da8b60a2c47987786d2c6c9205549dd6ef95df8bd/packaging-17.1.tar.gz";
94 sha256 = "0nrpayk8kij1zm9sjnk38ldz3a6705ggvw8ljylqbrb4vmqbf6gh";
95 };
96 };
97 "pygments" = super.buildPythonPackage {
98 name = "pygments-2.2.0";
99 doCheck = false;
100 src = fetchurl {
101 url = "https://files.pythonhosted.org/packages/71/2a/2e4e77803a8bd6408a2903340ac498cb0a2181811af7c9ec92cb70b0308a/Pygments-2.2.0.tar.gz";
102 sha256 = "1k78qdvir1yb1c634nkv6rbga8wv4289xarghmsbbvzhvr311bnv";
103 };
104 };
105 "pyparsing" = super.buildPythonPackage {
106 name = "pyparsing-2.2.0";
107 doCheck = false;
108 src = fetchurl {
109 url = "https://files.pythonhosted.org/packages/3c/ec/a94f8cf7274ea60b5413df054f82a8980523efd712ec55a59e7c3357cf7c/pyparsing-2.2.0.tar.gz";
110 sha256 = "016b9gh606aa44sq92jslm89bg874ia0yyiyb643fa6dgbsbqch8";
111 };
112 };
113 "pytz" = super.buildPythonPackage {
114 name = "pytz-2018.4";
115 doCheck = false;
116 src = fetchurl {
117 url = "https://files.pythonhosted.org/packages/10/76/52efda4ef98e7544321fd8d5d512e11739c1df18b0649551aeccfb1c8376/pytz-2018.4.tar.gz";
118 sha256 = "0jgpqx3kk2rhv81j1izjxvmx8d0x7hzs1857pgqnixic5wq2ar60";
119 };
120 };
121 "requests" = super.buildPythonPackage {
122 name = "requests-2.19.1";
123 doCheck = false;
124 propagatedBuildInputs = [
125 self."chardet"
126 self."idna"
127 self."urllib3"
128 self."certifi"
129 ];
130 src = fetchurl {
131 url = "https://files.pythonhosted.org/packages/54/1f/782a5734931ddf2e1494e4cd615a51ff98e1879cbe9eecbdfeaf09aa75e9/requests-2.19.1.tar.gz";
132 sha256 = "0snf8xxdzsgh1x2zv3vilvbrv9jbpmnfagzzb1rjmmvflckdh8pc";
133 };
134 };
135 "setuptools" = super.buildPythonPackage {
136 name = "setuptools-40.2.0";
137 doCheck = false;
138 src = fetchurl {
139 url = "https://files.pythonhosted.org/packages/ef/1d/201c13e353956a1c840f5d0fbf0461bd45bbd678ea4843ebf25924e8984c/setuptools-40.2.0.zip";
140 sha256 = "19ng5m7kigllg3x96c91y3a2k28g6kwnbb1v4warrnp4xma1v227";
141 };
142 };
143 "six" = super.buildPythonPackage {
144 name = "six-1.11.0";
145 doCheck = false;
146 src = fetchurl {
147 url = "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz";
148 sha256 = "1scqzwc51c875z23phj48gircqjgnn3af8zy2izjwmnlxrxsgs3h";
149 };
150 };
151 "snowballstemmer" = super.buildPythonPackage {
152 name = "snowballstemmer-1.2.1";
153 doCheck = false;
154 src = fetchurl {
155 url = "https://files.pythonhosted.org/packages/20/6b/d2a7cb176d4d664d94a6debf52cd8dbae1f7203c8e42426daa077051d59c/snowballstemmer-1.2.1.tar.gz";
156 sha256 = "0a0idq4y5frv7qsg2x62jd7rd272749xk4x99misf5rcifk2d7wi";
157 };
158 };
159 "sphinx" = super.buildPythonPackage {
160 name = "sphinx-1.7.8";
161 doCheck = false;
162 propagatedBuildInputs = [
163 self."six"
164 self."jinja2"
165 self."pygments"
166 self."docutils"
167 self."snowballstemmer"
168 self."babel"
169 self."alabaster"
170 self."imagesize"
171 self."requests"
172 self."setuptools"
173 self."packaging"
174 self."sphinxcontrib-websupport"
175 self."typing"
176 ];
177 src = fetchurl {
178 url = "https://files.pythonhosted.org/packages/ac/54/4ef326d0c654da1ed91341a7a1f43efc18a8c770ddd2b8e45df97cb79d82/Sphinx-1.7.8.tar.gz";
179 sha256 = "1ryz0w4c31930f1br2sjwrxwx9cmsy7cqdb0d81g98n9bj250w50";
180 };
181 };
182 "sphinx-rtd-theme" = super.buildPythonPackage {
183 name = "sphinx-rtd-theme-0.4.1";
184 doCheck = false;
185 propagatedBuildInputs = [
186 self."sphinx"
187 ];
188 src = fetchurl {
189 url = "https://files.pythonhosted.org/packages/f2/b0/a1933d792b806118ddbca6699f2e2c844d9b1b16e84a89d7effd5cd2a800/sphinx_rtd_theme-0.4.1.tar.gz";
190 sha256 = "1xkyqam8dzbjaymdyvkiif85m4y3jf8crdiwlgcfp8gqcj57aj9v";
191 };
192 };
193 "sphinxcontrib-websupport" = super.buildPythonPackage {
194 name = "sphinxcontrib-websupport-1.1.0";
195 doCheck = false;
196 src = fetchurl {
197 url = "https://files.pythonhosted.org/packages/07/7a/e74b06dce85555ffee33e1d6b7381314169ebf7e31b62c18fcb2815626b7/sphinxcontrib-websupport-1.1.0.tar.gz";
198 sha256 = "1ff3ix76xi1y6m99qxhaq5161ix9swwzydilvdya07mgbcvpzr4x";
199 };
200 };
201 "typing" = super.buildPythonPackage {
202 name = "typing-3.6.6";
203 doCheck = false;
204 src = fetchurl {
205 url = "https://files.pythonhosted.org/packages/bf/9b/2bf84e841575b633d8d91ad923e198a415e3901f228715524689495b4317/typing-3.6.6.tar.gz";
206 sha256 = "0ba9acs4awx15bf9v3nrs781msbd2nx826906nj6fqks2bvca9s0";
207 };
208 };
209 "urllib3" = super.buildPythonPackage {
210 name = "urllib3-1.23";
211 doCheck = false;
212 src = fetchurl {
213 url = "https://files.pythonhosted.org/packages/3c/d2/dc5471622bd200db1cd9319e02e71bc655e9ea27b8e0ce65fc69de0dac15/urllib3-1.23.tar.gz";
214 sha256 = "1bvbd35q3zdcd7gsv38fwpizy7p06dr0154g5gfybrvnbvhwb2m6";
215 };
216 };
217
218 ### Test requirements
219
220
221 }
@@ -0,0 +1,133 b''
1 |RCE| 4.13.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2018-09-05
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - Branch permissions: new set of permissions were added to control branch modification.
14 There are 4 basic permissions that can be set for branch names/branch patterns:
15 * no-access (any modification for given branch is forbidden)
16 * web-merge (modify branch by web based PR merge)
17 * push (only non-forced modification on branch are allowed)
18 * forced push (all modification to branch are allowed)
19 Available in EE edition only.
20 - Unified search and repo-switcher: a new persistent search box is now present allowing
21 to search for repositories, repository groups, commits (using full text search),
22 users, user-groups. Replaces redundant quick-filters/repo switcher.
23 - Default Reviewers: added possibility to match against regex based pattern as
24 alternative syntax to glob which didn't handle all the cases.
25 - Built-in Error tracker: added new exception tracking capability. All errors are now
26 tracked and stored. This allows instance admins to see potential problems without
27 access to the machine and logs.
28 - User Groups: each user group which users have access to expose public profile link.
29 It's possible to view the members of a group before attaching it to any resource.
30 - New caching framework: existing Beaker cache was completely replaced by dogpile.cache
31 library. This new cache framework in addition to solving multiple
32 performance/reliability problems of Beaker is used to cache permissions tree.
33 This gives huge performance boosts for very large and complex permission trees.
34 - Pull Requests: description field is now allowed to use a RST/Markdown syntax.
35 - SVN: added support for SVN 1.10 release line.
36
37
38 General
39 ^^^^^^^
40
41 - Google: updated google auth plugin with latest API changes.
42 - Frontend: Switched to Polymer 2.0.
43 - Events: added a default timeout for operation calling the endpoint url, so
44 they won't block forever.
45 - SQLAlchemy: allow DB connection ping/refresh using dedicated flag from .ini file.
46 `sqlalchemy.db1.ping_connection = true`
47 - Pull Requests: added option to force-refresh merge workspace in case of problems.
48 Adding GET param `?force_refresh=1` into PR page triggers the refresh.
49 - Pull Requests: show more info about version of comment vs latest version.
50 - Diffs: skip line numbers during copy from a diff view.
51 - License: use simple cache to read license info.
52 Due to the complex and expensive encryption, this reduces requests time by ~10ms.
53 - Debug: add new custom logging to track unique requests across systems.
54 Allows tracking single requests in very busy system by unique ID added into logging system.
55 - Configuration: .ini files now can replace a special placeholders e.g "{ENV_NAME}"
56 into a value from the ENVIRONMENT. Allows easier setup in Docker and similar.
57 - Backend: don't support vcsserver.scm_app anymore, now it uses http even if scm_app
58 is specified.
59 - Repositories: re-order creation/fork forms for better UX and consistency.
60 - UI: Add the number of inactive users in _admin/users and _admin/user_groups
61 - UX: updated registration form to better indicate what is the process of binding a
62 RhodeCode account with external one like Google.
63 - API: pull-requests allow automatic title generation via API
64 - VCSServer: errors: use a better interface to track exceptions and tracebacks.
65 - VCSServer: caches: replaced beaker with dogpile cache.
66 - GIT: use GIT_DISCOVERY_ACROSS_FILESYSTEM for better compatibility on NFS servers.
67 - Dependencies: bumped mercurial to 4.6.2
68 - Dependencies: bumped evolve to 8.0.1
69 - Dependencies: bumped hgsubversion to 1.9.2
70 - Dependencies: bumped git version to 2.16.4
71 - Dependencies: bumped SVN to 1.10.2
72 - Dependencies: added alternative pymysql drivers for mysql
73 - NIX: updated to 18.03 nix packages, now shipped with python 2.7.15
74 release and multiple other new libraries.
75
76
77 Security
78 ^^^^^^^^
79
80 - Mercurial: general protocol security updates.
81 * Fixes Mercurial's CVE for lack of permissions checking on mercurial batch commands.
82 * Introduced more strict checks for permissions, now they default to push instead of pull.
83 * Decypher batch commands and pick top-most permission to be required.
84 * This follows changes in Mercurial CORE after 4.6.1 release.
85 - Fixed bug in bleach sanitizer allowing certain custom payload to bypass it. Now
86 we always fails if sanitizing fails. This could lead to stored XSS
87 - Fixed stored XSS in binary file rendering.
88 - Fixed stored XSS in repo forks datagrid.
89
90
91 Performance
92 ^^^^^^^^^^^
93
94 - Permissions: Permission trees for users and now cached, after calculation.
95 This reduces response time for some pages dramatically.
96 In case of any permission changes caches are invalidated.
97 - Core: new dogpile.cache based cache framework was introduced, which is faster than
98 previously used Beaker.
99
100
101 Fixes
102 ^^^^^
103
104 - Audit Logs: store properly IP for certain events.
105 - External Auth: pass along came_from into the url so we get properly
106 redirected back after logging using external auth provider.
107 - Pull Requests: lock submit on pull request to prevent double submission on a fast click.
108 - Pull Requests: fixed a case of unresolved comments attached to removed file in pull request.
109 That prevented from closing it.
110 - Pull Requests: use numeric repo id for creation of shadow repos. Fixes a problem
111 when repository is renamed during PR lifetime.
112 - API: fixed creation of a pull request with default reviewer rules.
113 - Default Reviewers: fixed voting rule calculation on user group.
114 - Pull Requests: in GIT use force fetch and update for target ref.
115 This solves a case when in PR a target repository is force updated (by push force)
116 and is out of sync.
117 - VCSServer: detect early potential locale problem, and fallback to LC_ALL=C,
118 instead of crashing vcsserver.
119 - Pull Requests: use a safer way of destroying shadow repositories.
120 Fixes some problems in NFS storage and big repositories
121
122
123 Upgrade notes
124 ^^^^^^^^^^^^^
125
126 - The direct backend `vcsserver.scm_app` is not supported anymore. This backed was
127 already deprecated some time ago. Now it will use `http` mode even if scm_app is
128 specified. Please contact us in case you still use it, and not sure how to upgrade.
129 - New dogpile cache settings are not ported to converted .ini. If users want to do
130 adjustments please copy the settings over dogpile cache section from a newly
131 generated rhodecode.template.ini file. This file is stored next to rhodecode.ini
132 - SVN 1.10.2 was introduced in this release. Please make sure to update your
133 mod_dav to the same version for best compatibility.
@@ -0,0 +1,52 b''
1
2 ==============================
3 Generate the Nix expressions
4 ==============================
5
6 Details can be found in the repository of `RhodeCode Enterprise CE`_ inside of
7 the file `docs/contributing/dependencies.rst`.
8
9 Start the environment as follows:
10
11 .. code:: shell
12
13 nix-shell pkgs/shell-generate.nix
14
15
16
17 Python dependencies
18 ===================
19
20 .. code:: shell
21
22 pip2nix generate --licenses
23 # or
24 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
25
26
27 NodeJS dependencies
28 ===================
29
30 .. code:: shell
31
32 rm -rf node_modules
33 nix-shell pkgs/shell-generate.nix --command "
34 node2nix --input package.json \
35 -o pkgs/node-packages.nix \
36 -e pkgs/node-env.nix \
37 -c pkgs/node-default.nix \
38 -d --flatten --nodejs-6 "
39
40
41
42 Bower dependencies
43 ==================
44
45 .. code:: shell
46
47 nix-shell pkgs/shell-generate.nix --command "bower2nix bower.json pkgs/bower-packages.nix"
48
49
50 .. Links
51
52 .. _RhodeCode Enterprise CE: https://code.rhodecode.com/rhodecode-enterprise-ce
@@ -0,0 +1,17 b''
1 { pkgs
2 , pythonPackages
3 }:
4
5 rec {
6 pip2nix-src = pkgs.fetchzip {
7 url = https://github.com/johbo/pip2nix/archive/51e6fdae34d0e8ded9efeef7a8601730249687a6.tar.gz;
8 sha256 = "02a4jjgi7lsvf8mhrxsd56s9a3yg20081rl9bgc2m84w60v2gbz2";
9 };
10
11 pip2nix = import pip2nix-src {
12 inherit
13 pkgs
14 pythonPackages;
15 };
16
17 }
@@ -0,0 +1,13 b''
1 diff -rup Beaker-1.9.1-orig/beaker/ext/database.py Beaker-1.9.1/beaker/ext/database.py
2 --- Beaker-1.9.1-orig/beaker/ext/database.py 2018-05-22 18:22:34.802619619 +0200
3 +++ Beaker-1.9.1/beaker/ext/database.py 2018-05-22 17:07:14.048335196 +0200
4 @@ -91,7 +91,8 @@ class DatabaseNamespaceManager(OpenResou
5 sa.Column('created', types.DateTime, nullable=False),
6 sa.Column('data', types.PickleType, nullable=False),
7 sa.UniqueConstraint('namespace'),
8 - schema=schema_name if schema_name else meta.schema
9 + schema=schema_name if schema_name else meta.schema,
10 + extend_existing=True
11 )
12 cache.create(checkfirst=True)
13 return cache
@@ -0,0 +1,53 b''
1 { pkgs ? (import <nixpkgs> {})
2 , pythonPackages ? "python27Packages"
3 }:
4
5 with pkgs.lib;
6
7 let _pythonPackages = pythonPackages; in
8 let
9 pythonPackages = getAttr _pythonPackages pkgs;
10
11 pip2nix = import ./nix-common/pip2nix.nix {
12 inherit
13 pkgs
14 pythonPackages;
15 };
16
17 in
18
19 pkgs.stdenv.mkDerivation {
20 name = "pip2nix-generated";
21 buildInputs = [
22 # Allows to generate python packages
23 pip2nix.pip2nix
24 pythonPackages.pip-tools
25
26 # Allows to generate bower dependencies
27 pkgs.nodePackages.bower2nix
28
29 # Allows to generate node dependencies
30 pkgs.nodePackages.node2nix
31
32 # We need mysql_config to be around
33 pkgs.mysql
34
35 # We need postgresql to be around
36 pkgs.postgresql
37
38 # Curl is needed for pycurl
39 pkgs.curl
40 ];
41
42 shellHook = ''
43 runHook preShellHook
44 runHook postShellHook
45 '';
46
47 preShellHook = ''
48 echo "Starting Generate Shell"
49 # Custom prompt to distinguish from other dev envs.
50 export PS1="\n\[\033[1;32m\][Generate-shell:\w]$\[\033[0m\] "
51 export PYCURL_SSL_LIBRARY=openssl
52 '';
53 }
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,5 +1,5 b''
1 [bumpversion]
1 [bumpversion]
2 current_version = 4.12.4
2 current_version = 4.13.0
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
@@ -5,25 +5,20 b' done = false'
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
9
8
10 [task:fixes_on_stable]
9 [task:fixes_on_stable]
11 done = true
12
10
13 [task:pip2nix_generated]
11 [task:pip2nix_generated]
14 done = true
15
12
16 [task:changelog_updated]
13 [task:changelog_updated]
17 done = true
18
14
19 [task:generate_api_docs]
15 [task:generate_api_docs]
20 done = true
16
17 [task:updated_translation]
21
18
22 [release]
19 [release]
23 state = prepared
20 state = in_progress
24 version = 4.12.4
21 version = 4.13.0
25
26 [task:updated_translation]
27
22
28 [task:generate_js_routes]
23 [task:generate_js_routes]
29
24
@@ -26,6 +26,8 b' recursive-include rhodecode *.mako'
26 # 502 page
26 # 502 page
27 include rhodecode/public/502.html
27 include rhodecode/public/502.html
28
28
29 # robots
30 include rhodecode/public/robots.txt
29
31
30 # images, css
32 # images, css
31 include rhodecode/public/css/*.css
33 include rhodecode/public/css/*.css
@@ -7,8 +7,9 b' About'
7
7
8 ``RhodeCode`` is a fast and powerful management tool for Mercurial_ and GIT_
8 ``RhodeCode`` is a fast and powerful management tool for Mercurial_ and GIT_
9 and Subversion_ with a built in push/pull server, full text search,
9 and Subversion_ with a built in push/pull server, full text search,
10 pull requests and powerfull code-review system. It works on http/https and
10 pull requests and powerful code-review system. It works on http/https and
11 has a few unique features like:
11 has a few unique features like:
12
12 - plugable architecture
13 - plugable architecture
13 - advanced permission system with IP restrictions
14 - advanced permission system with IP restrictions
14 - rich set of authentication plugins including LDAP,
15 - rich set of authentication plugins including LDAP,
@@ -78,10 +79,9 b' Listed bellow are various support resour'
78
79
79 - Official issue tracker `RhodeCode Issue tracker <https://issues.rhodecode.com>`_
80 - Official issue tracker `RhodeCode Issue tracker <https://issues.rhodecode.com>`_
80
81
81 - Search our community portal `Community portal <https://community.rhodecode.com>`_
82 - Official Slack Community Channel `RhodeCode Slack <https://rhodecode.com/join>`_
82
83
83 - Join #rhodecode on FreeNode (irc.freenode.net)
84 - Search our community portal `Community portal <https://community.rhodecode.com>`_
84 or use http://webchat.freenode.net/?channels=rhodecode for web access to irc.
85
85
86 - You can also follow RhodeCode on twitter **@RhodeCode** where we often post
86 - You can also follow RhodeCode on twitter **@RhodeCode** where we often post
87 news and other interesting stuff about RhodeCode.
87 news and other interesting stuff about RhodeCode.
@@ -3,15 +3,15 b''
3 "description": "User interface for elements for rhodecode",
3 "description": "User interface for elements for rhodecode",
4 "main": "index.html",
4 "main": "index.html",
5 "dependencies": {
5 "dependencies": {
6 "webcomponentsjs": "^0.7.22",
6 "webcomponentsjs": "^1.2.3",
7 "polymer": "Polymer/polymer#^1.6.1",
7 "polymer": "Polymer/polymer#^2.6.0",
8 "paper-button": "PolymerElements/paper-button#^1.0.13",
8 "paper-button": "PolymerElements/paper-button#^2.1.2",
9 "paper-spinner": "PolymerElements/paper-spinner#^1.2.0",
9 "paper-spinner": "PolymerElements/paper-spinner#^2.1.0",
10 "paper-tooltip": "PolymerElements/paper-tooltip#^1.1.2",
10 "paper-tooltip": "PolymerElements/paper-tooltip#^2.1.1",
11 "paper-toast": "PolymerElements/paper-toast#^1.3.0",
11 "paper-toast": "PolymerElements/paper-toast#^2.1.2",
12 "paper-toggle-button": "PolymerElements/paper-toggle-button#^1.2.0",
12 "paper-toggle-button": "PolymerElements/paper-toggle-button#^2.1.1",
13 "iron-ajax": "PolymerElements/iron-ajax#^1.4.3",
13 "iron-ajax": "PolymerElements/iron-ajax#^2.1.3",
14 "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#^1.0.13",
14 "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#^2.2.0",
15 "iron-a11y-keys": "PolymerElements/iron-a11y-keys#^1.0.6"
15 "iron-a11y-keys": "PolymerElements/iron-a11y-keys#^2.1.2"
16 }
16 }
17 }
17 }
@@ -2,7 +2,6 b''
2
2
3 ################################################################################
3 ################################################################################
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
5 # The %(here)s variable will be replaced with the parent directory of this file#
6 ################################################################################
5 ################################################################################
7
6
8 [DEFAULT]
7 [DEFAULT]
@@ -46,10 +45,9 b' debug = true'
46 host = 127.0.0.1
45 host = 127.0.0.1
47 port = 5000
46 port = 5000
48
47
49 ##################################
48 ###########################################################
50 ## WAITRESS WSGI SERVER ##
49 ## WAITRESS WSGI SERVER - Recommended for Development ####
51 ## Recommended for Development ##
50 ###########################################################
52 ##################################
53
51
54 use = egg:waitress#main
52 use = egg:waitress#main
55 ## number of worker threads
53 ## number of worker threads
@@ -67,15 +65,15 b' asyncore_use_poll = true'
67 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
65 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
68
66
69 #use = egg:gunicorn#main
67 #use = egg:gunicorn#main
70 ## Sets the number of process workers. You must set `instance_id = *`
68 ## Sets the number of process workers. More workers means more concurent connections
71 ## when this option is set to more than one worker, recommended
69 ## RhodeCode can handle at the same time. Each additional worker also it increases
72 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
70 ## memory usage as each has it's own set of caches.
73 ## The `instance_id = *` must be set in the [app:main] section below
71 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
72 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
73 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
74 ## when using more than 1 worker.
74 #workers = 2
75 #workers = 2
75 ## number of threads for each of the worker, must be set to 1 for gevent
76 ## process name visible in process list
76 ## generally recommended to be at 1
77 #threads = 1
78 ## process name
79 #proc_name = rhodecode
77 #proc_name = rhodecode
80 ## type of worker class, one of sync, gevent
78 ## type of worker class, one of sync, gevent
81 ## recommended for bigger setup is using of of other than sync one
79 ## recommended for bigger setup is using of of other than sync one
@@ -103,6 +101,11 b' use = egg:PasteDeploy#prefix'
103 prefix = /
101 prefix = /
104
102
105 [app:main]
103 [app:main]
104 ## The %(here)s variable will be replaced with the absolute path of parent directory
105 ## of this file
106 ## In addition ENVIRONMENT variables usage is possible, e.g
107 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
108
106 use = egg:rhodecode-enterprise-ce
109 use = egg:rhodecode-enterprise-ce
107
110
108 ## enable proxy prefix middleware, defined above
111 ## enable proxy prefix middleware, defined above
@@ -148,12 +151,12 b' gzip_responses = false'
148 ## autogenerate javascript routes file on startup
151 ## autogenerate javascript routes file on startup
149 generate_js_files = false
152 generate_js_files = false
150
153
151 ## Optional Languages
154 ## System global default language.
152 ## en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
155 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
153 lang = en
156 lang = en
154
157
155 ## perform a full repository scan on each server start, this should be
158 ## Perform a full repository scan and import on each server start.
156 ## set to false after first startup, to allow faster server restarts.
159 ## Settings this to true could lead to very long startup time.
157 startup.import_repos = false
160 startup.import_repos = false
158
161
159 ## Uncomment and set this path to use archive download cache.
162 ## Uncomment and set this path to use archive download cache.
@@ -167,23 +170,23 b' startup.import_repos = false'
167 ## SSH calls. Set this for events to receive proper url for SSH calls.
170 ## SSH calls. Set this for events to receive proper url for SSH calls.
168 app.base_url = http://rhodecode.local
171 app.base_url = http://rhodecode.local
169
172
170 ## change this to unique ID for security
173 ## Unique application ID. Should be a random unique string for security.
171 app_instance_uuid = rc-production
174 app_instance_uuid = rc-production
172
175
173 ## cut off limit for large diffs (size in bytes). If overall diff size on
176 ## Cut off limit for large diffs (size in bytes). If overall diff size on
174 ## commit, or pull request exceeds this limit this diff will be displayed
177 ## commit, or pull request exceeds this limit this diff will be displayed
175 ## partially. E.g 512000 == 512Kb
178 ## partially. E.g 512000 == 512Kb
176 cut_off_limit_diff = 512000
179 cut_off_limit_diff = 512000
177
180
178 ## cut off limit for large files inside diffs (size in bytes). Each individual
181 ## Cut off limit for large files inside diffs (size in bytes). Each individual
179 ## file inside diff which exceeds this limit will be displayed partially.
182 ## file inside diff which exceeds this limit will be displayed partially.
180 ## E.g 128000 == 128Kb
183 ## E.g 128000 == 128Kb
181 cut_off_limit_file = 128000
184 cut_off_limit_file = 128000
182
185
183 ## use cache version of scm repo everywhere
186 ## use cached version of vcs repositories everywhere. Recommended to be `true`
184 vcs_full_cache = true
187 vcs_full_cache = true
185
188
186 ## force https in RhodeCode, fixes https redirects, assumes it's always https
189 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
187 ## Normally this is controlled by proper http flags sent from http server
190 ## Normally this is controlled by proper http flags sent from http server
188 force_https = false
191 force_https = false
189
192
@@ -230,7 +233,7 b' gist_alias_url ='
230 # GistView:*
233 # GistView:*
231 api_access_controllers_whitelist =
234 api_access_controllers_whitelist =
232
235
233 ## default encoding used to convert from and to unicode
236 ## Default encoding used to convert from and to unicode
234 ## can be also a comma separated list of encoding in case of mixed encodings
237 ## can be also a comma separated list of encoding in case of mixed encodings
235 default_encoding = UTF-8
238 default_encoding = UTF-8
236
239
@@ -277,8 +280,8 b' allow_repo_location_change = true'
277 ## allows to setup custom hooks in settings page
280 ## allows to setup custom hooks in settings page
278 allow_custom_hooks_settings = true
281 allow_custom_hooks_settings = true
279
282
280 ## generated license token, goto license page in RhodeCode settings to obtain
283 ## Generated license token required for EE edition license.
281 ## new token
284 ## New generated token value can be found in Admin > settings > license page.
282 license_token =
285 license_token =
283
286
284 ## supervisor connection uri, for managing supervisor and logs.
287 ## supervisor connection uri, for managing supervisor and logs.
@@ -308,65 +311,66 b' celery.max_tasks_per_child = 100'
308 ## tasks will never be sent to the queue, but executed locally instead.
311 ## tasks will never be sent to the queue, but executed locally instead.
309 celery.task_always_eager = false
312 celery.task_always_eager = false
310
313
311 ####################################
314 #####################################
312 ### BEAKER CACHE ####
315 ### DOGPILE CACHE ####
313 ####################################
316 #####################################
314 # default cache dir for templates. Putting this into a ramdisk
317 ## Default cache dir for caches. Putting this into a ramdisk
315 ## can boost performance, eg. %(here)s/data_ramdisk
318 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
319 ## large amount of space
316 cache_dir = %(here)s/data
320 cache_dir = %(here)s/data
317
321
318 ## locking and default file storage for Beaker. Putting this into a ramdisk
322 ## `cache_perms` cache settings for permission tree, auth TTL.
319 ## can boost performance, eg. %(here)s/data_ramdisk/cache/beaker_data
323 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
320 beaker.cache.data_dir = %(here)s/data/cache/beaker_data
324 rc_cache.cache_perms.expiration_time = 300
321 beaker.cache.lock_dir = %(here)s/data/cache/beaker_lock
322
323 beaker.cache.regions = super_short_term, short_term, long_term, sql_cache_short, auth_plugins, repo_cache_long
324
325
325 beaker.cache.super_short_term.type = memory
326 ## alternative `cache_perms` redis backend with distributed lock
326 beaker.cache.super_short_term.expire = 10
327 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
327 beaker.cache.super_short_term.key_length = 256
328 #rc_cache.cache_perms.expiration_time = 300
329 ## redis_expiration_time needs to be greater then expiration_time
330 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
331 #rc_cache.cache_perms.arguments.socket_timeout = 30
332 #rc_cache.cache_perms.arguments.host = localhost
333 #rc_cache.cache_perms.arguments.port = 6379
334 #rc_cache.cache_perms.arguments.db = 0
335 #rc_cache.cache_perms.arguments.distributed_lock = true
328
336
329 beaker.cache.short_term.type = memory
337 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
330 beaker.cache.short_term.expire = 60
338 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
331 beaker.cache.short_term.key_length = 256
339 rc_cache.cache_repo.expiration_time = 2592000
332
333 beaker.cache.long_term.type = memory
334 beaker.cache.long_term.expire = 36000
335 beaker.cache.long_term.key_length = 256
336
340
337 beaker.cache.sql_cache_short.type = memory
341 ## alternative `cache_repo` redis backend with distributed lock
338 beaker.cache.sql_cache_short.expire = 10
342 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
339 beaker.cache.sql_cache_short.key_length = 256
343 #rc_cache.cache_repo.expiration_time = 2592000
344 ## redis_expiration_time needs to be greater then expiration_time
345 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
346 #rc_cache.cache_repo.arguments.socket_timeout = 30
347 #rc_cache.cache_repo.arguments.host = localhost
348 #rc_cache.cache_repo.arguments.port = 6379
349 #rc_cache.cache_repo.arguments.db = 1
350 #rc_cache.cache_repo.arguments.distributed_lock = true
340
351
341 ## default is memory cache, configure only if required
352 ## cache settings for SQL queries, this needs to use memory type backend
342 ## using multi-node or multi-worker setup
353 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
343 #beaker.cache.auth_plugins.type = ext:database
354 rc_cache.sql_cache_short.expiration_time = 30
344 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
345 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
346 #beaker.cache.auth_plugins.url = mysql://root:secret@127.0.0.1/rhodecode
347 #beaker.cache.auth_plugins.sa.pool_recycle = 3600
348 #beaker.cache.auth_plugins.sa.pool_size = 10
349 #beaker.cache.auth_plugins.sa.max_overflow = 0
350
355
351 beaker.cache.repo_cache_long.type = memorylru_base
356 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
352 beaker.cache.repo_cache_long.max_items = 4096
357 ## type backend as the objects kept are not pickle serializable
353 beaker.cache.repo_cache_long.expire = 2592000
358 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
359 ## by default we use 96H, this is using invalidation on push anyway
360 rc_cache.cache_repo_longterm.expiration_time = 345600
361 ## max items in LRU cache, reduce this number to save memory, and expire last used
362 ## cached objects
363 rc_cache.cache_repo_longterm.max_size = 10000
354
364
355 ## default is memorylru_base cache, configure only if required
356 ## using multi-node or multi-worker setup
357 #beaker.cache.repo_cache_long.type = ext:memcached
358 #beaker.cache.repo_cache_long.url = localhost:11211
359 #beaker.cache.repo_cache_long.expire = 1209600
360 #beaker.cache.repo_cache_long.key_length = 256
361
365
362 ####################################
366 ####################################
363 ### BEAKER SESSION ####
367 ### BEAKER SESSION ####
364 ####################################
368 ####################################
365
369
366 ## .session.type is type of storage options for the session, current allowed
370 ## .session.type is type of storage options for the session, current allowed
367 ## types are file, ext:memcached, ext:database, and memory (default).
371 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
368 beaker.session.type = file
372 beaker.session.type = file
369 beaker.session.data_dir = %(here)s/data/sessions/data
373 beaker.session.data_dir = %(here)s/data/sessions
370
374
371 ## db based session, fast, and allows easy management over logged in users
375 ## db based session, fast, and allows easy management over logged in users
372 #beaker.session.type = ext:database
376 #beaker.session.type = ext:database
@@ -502,10 +506,7 b' appenlight.log_namespace_blacklist ='
502 ################################################################################
506 ################################################################################
503 #set debug = false
507 #set debug = false
504
508
505
509 # enable debug style page
506 ##############
507 ## STYLING ##
508 ##############
509 debug_style = true
510 debug_style = true
510
511
511 ###########################################
512 ###########################################
@@ -514,6 +515,9 b' debug_style = true'
514 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
515 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
515 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
516 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
516 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
517 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
518 # pymysql is an alternative driver for MySQL, use in case of problems with default one
519 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
520
517 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
521 sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
518
522
519 # see sqlalchemy docs for other advanced settings
523 # see sqlalchemy docs for other advanced settings
@@ -533,6 +537,9 b' sqlalchemy.db1.convert_unicode = true'
533 ## which defaults to five.
537 ## which defaults to five.
534 #sqlalchemy.db1.max_overflow = 10
538 #sqlalchemy.db1.max_overflow = 10
535
539
540 ## Connection check ping, used to detect broken database connections
541 ## could be enabled to better handle cases if MySQL has gone away errors
542 #sqlalchemy.db1.ping_connection = true
536
543
537 ##################
544 ##################
538 ### VCS CONFIG ###
545 ### VCS CONFIG ###
@@ -547,15 +554,18 b' vcs.server.protocol = http'
547
554
548 ## Push/Pull operations protocol, available options are:
555 ## Push/Pull operations protocol, available options are:
549 ## `http` - use http-rpc backend (default)
556 ## `http` - use http-rpc backend (default)
550 ##
551 vcs.scm_app_implementation = http
557 vcs.scm_app_implementation = http
552
558
553 ## Push/Pull operations hooks protocol, available options are:
559 ## Push/Pull operations hooks protocol, available options are:
554 ## `http` - use http-rpc backend (default)
560 ## `http` - use http-rpc backend (default)
555 vcs.hooks.protocol = http
561 vcs.hooks.protocol = http
556
562
563 ## Host on which this instance is listening for hooks. If vcsserver is in other location
564 ## this should be adjusted.
565 vcs.hooks.host = 127.0.0.1
566
557 vcs.server.log_level = debug
567 vcs.server.log_level = debug
558 ## Start VCSServer with this instance as a subprocess, usefull for development
568 ## Start VCSServer with this instance as a subprocess, useful for development
559 vcs.start_server = false
569 vcs.start_server = false
560
570
561 ## List of enabled VCS backends, available options are:
571 ## List of enabled VCS backends, available options are:
@@ -638,7 +648,7 b' custom.conf = 1'
638 ### LOGGING CONFIGURATION ####
648 ### LOGGING CONFIGURATION ####
639 ################################
649 ################################
640 [loggers]
650 [loggers]
641 keys = root, sqlalchemy, beaker, rhodecode, ssh_wrapper, celery
651 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
642
652
643 [handlers]
653 [handlers]
644 keys = console, console_sql
654 keys = console, console_sql
@@ -694,9 +704,12 b' level = DEBUG'
694 formatter = color_formatter
704 formatter = color_formatter
695
705
696 [handler_console_sql]
706 [handler_console_sql]
707 # "level = DEBUG" logs SQL queries and results.
708 # "level = INFO" logs SQL queries.
709 # "level = WARN" logs neither. (Recommended for production systems.)
697 class = StreamHandler
710 class = StreamHandler
698 args = (sys.stderr, )
711 args = (sys.stderr, )
699 level = DEBUG
712 level = WARN
700 formatter = color_formatter_sql
713 formatter = color_formatter_sql
701
714
702 ################
715 ################
@@ -715,5 +728,5 b' datefmt = %Y-%m-%d %H:%M:%S'
715
728
716 [formatter_color_formatter_sql]
729 [formatter_color_formatter_sql]
717 class = rhodecode.lib.logging_formatter.ColorFormatterSql
730 class = rhodecode.lib.logging_formatter.ColorFormatterSql
718 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
731 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
719 datefmt = %Y-%m-%d %H:%M:%S
732 datefmt = %Y-%m-%d %H:%M:%S
@@ -2,7 +2,6 b''
2
2
3 ################################################################################
3 ################################################################################
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
4 ## RHODECODE COMMUNITY EDITION CONFIGURATION ##
5 # The %(here)s variable will be replaced with the parent directory of this file#
6 ################################################################################
5 ################################################################################
7
6
8 [DEFAULT]
7 [DEFAULT]
@@ -46,10 +45,9 b' debug = true'
46 host = 127.0.0.1
45 host = 127.0.0.1
47 port = 5000
46 port = 5000
48
47
49 ##################################
48 ###########################################################
50 ## WAITRESS WSGI SERVER ##
49 ## WAITRESS WSGI SERVER - Recommended for Development ####
51 ## Recommended for Development ##
50 ###########################################################
52 ##################################
53
51
54 #use = egg:waitress#main
52 #use = egg:waitress#main
55 ## number of worker threads
53 ## number of worker threads
@@ -67,21 +65,21 b' port = 5000'
67 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
65 ## run with gunicorn --log-config rhodecode.ini --paste rhodecode.ini
68
66
69 use = egg:gunicorn#main
67 use = egg:gunicorn#main
70 ## Sets the number of process workers. You must set `instance_id = *`
68 ## Sets the number of process workers. More workers means more concurent connections
71 ## when this option is set to more than one worker, recommended
69 ## RhodeCode can handle at the same time. Each additional worker also it increases
72 ## value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers
70 ## memory usage as each has it's own set of caches.
73 ## The `instance_id = *` must be set in the [app:main] section below
71 ## Recommended value is (2 * NUMBER_OF_CPUS + 1), eg 2CPU = 5 workers, but no more
72 ## than 8-10 unless for really big deployments .e.g 700-1000 users.
73 ## `instance_id = *` must be set in the [app:main] section below (which is the default)
74 ## when using more than 1 worker.
74 workers = 2
75 workers = 2
75 ## number of threads for each of the worker, must be set to 1 for gevent
76 ## process name visible in process list
76 ## generally recommended to be at 1
77 #threads = 1
78 ## process name
79 proc_name = rhodecode
77 proc_name = rhodecode
80 ## type of worker class, one of sync, gevent
78 ## type of worker class, one of sync, gevent
81 ## recommended for bigger setup is using of of other than sync one
79 ## recommended for bigger setup is using of of other than sync one
82 worker_class = gevent
80 worker_class = gevent
83 ## The maximum number of simultaneous clients. Valid only for Gevent
81 ## The maximum number of simultaneous clients. Valid only for Gevent
84 #worker_connections = 10
82 worker_connections = 10
85 ## max number of requests that worker will handle before being gracefully
83 ## max number of requests that worker will handle before being gracefully
86 ## restarted, could prevent memory leaks
84 ## restarted, could prevent memory leaks
87 max_requests = 1000
85 max_requests = 1000
@@ -103,6 +101,11 b' use = egg:PasteDeploy#prefix'
103 prefix = /
101 prefix = /
104
102
105 [app:main]
103 [app:main]
104 ## The %(here)s variable will be replaced with the absolute path of parent directory
105 ## of this file
106 ## In addition ENVIRONMENT variables usage is possible, e.g
107 ## sqlalchemy.db1.url = {ENV_RC_DB_URL}
108
106 use = egg:rhodecode-enterprise-ce
109 use = egg:rhodecode-enterprise-ce
107
110
108 ## enable proxy prefix middleware, defined above
111 ## enable proxy prefix middleware, defined above
@@ -123,12 +126,12 b' gzip_responses = false'
123 ## autogenerate javascript routes file on startup
126 ## autogenerate javascript routes file on startup
124 generate_js_files = false
127 generate_js_files = false
125
128
126 ## Optional Languages
129 ## System global default language.
127 ## en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
130 ## All available languages: en(default), be, de, es, fr, it, ja, pl, pt, ru, zh
128 lang = en
131 lang = en
129
132
130 ## perform a full repository scan on each server start, this should be
133 ## Perform a full repository scan and import on each server start.
131 ## set to false after first startup, to allow faster server restarts.
134 ## Settings this to true could lead to very long startup time.
132 startup.import_repos = false
135 startup.import_repos = false
133
136
134 ## Uncomment and set this path to use archive download cache.
137 ## Uncomment and set this path to use archive download cache.
@@ -142,23 +145,23 b' startup.import_repos = false'
142 ## SSH calls. Set this for events to receive proper url for SSH calls.
145 ## SSH calls. Set this for events to receive proper url for SSH calls.
143 app.base_url = http://rhodecode.local
146 app.base_url = http://rhodecode.local
144
147
145 ## change this to unique ID for security
148 ## Unique application ID. Should be a random unique string for security.
146 app_instance_uuid = rc-production
149 app_instance_uuid = rc-production
147
150
148 ## cut off limit for large diffs (size in bytes). If overall diff size on
151 ## Cut off limit for large diffs (size in bytes). If overall diff size on
149 ## commit, or pull request exceeds this limit this diff will be displayed
152 ## commit, or pull request exceeds this limit this diff will be displayed
150 ## partially. E.g 512000 == 512Kb
153 ## partially. E.g 512000 == 512Kb
151 cut_off_limit_diff = 512000
154 cut_off_limit_diff = 512000
152
155
153 ## cut off limit for large files inside diffs (size in bytes). Each individual
156 ## Cut off limit for large files inside diffs (size in bytes). Each individual
154 ## file inside diff which exceeds this limit will be displayed partially.
157 ## file inside diff which exceeds this limit will be displayed partially.
155 ## E.g 128000 == 128Kb
158 ## E.g 128000 == 128Kb
156 cut_off_limit_file = 128000
159 cut_off_limit_file = 128000
157
160
158 ## use cache version of scm repo everywhere
161 ## use cached version of vcs repositories everywhere. Recommended to be `true`
159 vcs_full_cache = true
162 vcs_full_cache = true
160
163
161 ## force https in RhodeCode, fixes https redirects, assumes it's always https
164 ## Force https in RhodeCode, fixes https redirects, assumes it's always https.
162 ## Normally this is controlled by proper http flags sent from http server
165 ## Normally this is controlled by proper http flags sent from http server
163 force_https = false
166 force_https = false
164
167
@@ -205,7 +208,7 b' gist_alias_url ='
205 # GistView:*
208 # GistView:*
206 api_access_controllers_whitelist =
209 api_access_controllers_whitelist =
207
210
208 ## default encoding used to convert from and to unicode
211 ## Default encoding used to convert from and to unicode
209 ## can be also a comma separated list of encoding in case of mixed encodings
212 ## can be also a comma separated list of encoding in case of mixed encodings
210 default_encoding = UTF-8
213 default_encoding = UTF-8
211
214
@@ -252,8 +255,8 b' allow_repo_location_change = true'
252 ## allows to setup custom hooks in settings page
255 ## allows to setup custom hooks in settings page
253 allow_custom_hooks_settings = true
256 allow_custom_hooks_settings = true
254
257
255 ## generated license token, goto license page in RhodeCode settings to obtain
258 ## Generated license token required for EE edition license.
256 ## new token
259 ## New generated token value can be found in Admin > settings > license page.
257 license_token =
260 license_token =
258
261
259 ## supervisor connection uri, for managing supervisor and logs.
262 ## supervisor connection uri, for managing supervisor and logs.
@@ -283,65 +286,66 b' celery.max_tasks_per_child = 100'
283 ## tasks will never be sent to the queue, but executed locally instead.
286 ## tasks will never be sent to the queue, but executed locally instead.
284 celery.task_always_eager = false
287 celery.task_always_eager = false
285
288
286 ####################################
289 #####################################
287 ### BEAKER CACHE ####
290 ### DOGPILE CACHE ####
288 ####################################
291 #####################################
289 # default cache dir for templates. Putting this into a ramdisk
292 ## Default cache dir for caches. Putting this into a ramdisk
290 ## can boost performance, eg. %(here)s/data_ramdisk
293 ## can boost performance, eg. /tmpfs/data_ramdisk, however this directory might require
294 ## large amount of space
291 cache_dir = %(here)s/data
295 cache_dir = %(here)s/data
292
296
293 ## locking and default file storage for Beaker. Putting this into a ramdisk
297 ## `cache_perms` cache settings for permission tree, auth TTL.
294 ## can boost performance, eg. %(here)s/data_ramdisk/cache/beaker_data
298 rc_cache.cache_perms.backend = dogpile.cache.rc.file_namespace
295 beaker.cache.data_dir = %(here)s/data/cache/beaker_data
299 rc_cache.cache_perms.expiration_time = 300
296 beaker.cache.lock_dir = %(here)s/data/cache/beaker_lock
297
298 beaker.cache.regions = super_short_term, short_term, long_term, sql_cache_short, auth_plugins, repo_cache_long
299
300
300 beaker.cache.super_short_term.type = memory
301 ## alternative `cache_perms` redis backend with distributed lock
301 beaker.cache.super_short_term.expire = 10
302 #rc_cache.cache_perms.backend = dogpile.cache.rc.redis
302 beaker.cache.super_short_term.key_length = 256
303 #rc_cache.cache_perms.expiration_time = 300
304 ## redis_expiration_time needs to be greater then expiration_time
305 #rc_cache.cache_perms.arguments.redis_expiration_time = 7200
306 #rc_cache.cache_perms.arguments.socket_timeout = 30
307 #rc_cache.cache_perms.arguments.host = localhost
308 #rc_cache.cache_perms.arguments.port = 6379
309 #rc_cache.cache_perms.arguments.db = 0
310 #rc_cache.cache_perms.arguments.distributed_lock = true
303
311
304 beaker.cache.short_term.type = memory
312 ## `cache_repo` cache settings for FileTree, Readme, RSS FEEDS
305 beaker.cache.short_term.expire = 60
313 rc_cache.cache_repo.backend = dogpile.cache.rc.file_namespace
306 beaker.cache.short_term.key_length = 256
314 rc_cache.cache_repo.expiration_time = 2592000
307
308 beaker.cache.long_term.type = memory
309 beaker.cache.long_term.expire = 36000
310 beaker.cache.long_term.key_length = 256
311
315
312 beaker.cache.sql_cache_short.type = memory
316 ## alternative `cache_repo` redis backend with distributed lock
313 beaker.cache.sql_cache_short.expire = 10
317 #rc_cache.cache_repo.backend = dogpile.cache.rc.redis
314 beaker.cache.sql_cache_short.key_length = 256
318 #rc_cache.cache_repo.expiration_time = 2592000
319 ## redis_expiration_time needs to be greater then expiration_time
320 #rc_cache.cache_repo.arguments.redis_expiration_time = 2678400
321 #rc_cache.cache_repo.arguments.socket_timeout = 30
322 #rc_cache.cache_repo.arguments.host = localhost
323 #rc_cache.cache_repo.arguments.port = 6379
324 #rc_cache.cache_repo.arguments.db = 1
325 #rc_cache.cache_repo.arguments.distributed_lock = true
315
326
316 ## default is memory cache, configure only if required
327 ## cache settings for SQL queries, this needs to use memory type backend
317 ## using multi-node or multi-worker setup
328 rc_cache.sql_cache_short.backend = dogpile.cache.rc.memory_lru
318 #beaker.cache.auth_plugins.type = ext:database
329 rc_cache.sql_cache_short.expiration_time = 30
319 #beaker.cache.auth_plugins.lock_dir = %(here)s/data/cache/auth_plugin_lock
320 #beaker.cache.auth_plugins.url = postgresql://postgres:secret@localhost/rhodecode
321 #beaker.cache.auth_plugins.url = mysql://root:secret@127.0.0.1/rhodecode
322 #beaker.cache.auth_plugins.sa.pool_recycle = 3600
323 #beaker.cache.auth_plugins.sa.pool_size = 10
324 #beaker.cache.auth_plugins.sa.max_overflow = 0
325
330
326 beaker.cache.repo_cache_long.type = memorylru_base
331 ## `cache_repo_longterm` cache for repo object instances, this needs to use memory
327 beaker.cache.repo_cache_long.max_items = 4096
332 ## type backend as the objects kept are not pickle serializable
328 beaker.cache.repo_cache_long.expire = 2592000
333 rc_cache.cache_repo_longterm.backend = dogpile.cache.rc.memory_lru
334 ## by default we use 96H, this is using invalidation on push anyway
335 rc_cache.cache_repo_longterm.expiration_time = 345600
336 ## max items in LRU cache, reduce this number to save memory, and expire last used
337 ## cached objects
338 rc_cache.cache_repo_longterm.max_size = 10000
329
339
330 ## default is memorylru_base cache, configure only if required
331 ## using multi-node or multi-worker setup
332 #beaker.cache.repo_cache_long.type = ext:memcached
333 #beaker.cache.repo_cache_long.url = localhost:11211
334 #beaker.cache.repo_cache_long.expire = 1209600
335 #beaker.cache.repo_cache_long.key_length = 256
336
340
337 ####################################
341 ####################################
338 ### BEAKER SESSION ####
342 ### BEAKER SESSION ####
339 ####################################
343 ####################################
340
344
341 ## .session.type is type of storage options for the session, current allowed
345 ## .session.type is type of storage options for the session, current allowed
342 ## types are file, ext:memcached, ext:database, and memory (default).
346 ## types are file, ext:memcached, ext:redis, ext:database, and memory (default).
343 beaker.session.type = file
347 beaker.session.type = file
344 beaker.session.data_dir = %(here)s/data/sessions/data
348 beaker.session.data_dir = %(here)s/data/sessions
345
349
346 ## db based session, fast, and allows easy management over logged in users
350 ## db based session, fast, and allows easy management over logged in users
347 #beaker.session.type = ext:database
351 #beaker.session.type = ext:database
@@ -484,6 +488,9 b' set debug = false'
484 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
488 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
485 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
489 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
486 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
490 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
491 # pymysql is an alternative driver for MySQL, use in case of problems with default one
492 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
493
487 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
494 sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
488
495
489 # see sqlalchemy docs for other advanced settings
496 # see sqlalchemy docs for other advanced settings
@@ -503,6 +510,9 b' sqlalchemy.db1.convert_unicode = true'
503 ## which defaults to five.
510 ## which defaults to five.
504 #sqlalchemy.db1.max_overflow = 10
511 #sqlalchemy.db1.max_overflow = 10
505
512
513 ## Connection check ping, used to detect broken database connections
514 ## could be enabled to better handle cases if MySQL has gone away errors
515 #sqlalchemy.db1.ping_connection = true
506
516
507 ##################
517 ##################
508 ### VCS CONFIG ###
518 ### VCS CONFIG ###
@@ -517,15 +527,17 b' vcs.server.protocol = http'
517
527
518 ## Push/Pull operations protocol, available options are:
528 ## Push/Pull operations protocol, available options are:
519 ## `http` - use http-rpc backend (default)
529 ## `http` - use http-rpc backend (default)
520 ##
521 vcs.scm_app_implementation = http
530 vcs.scm_app_implementation = http
522
531
523 ## Push/Pull operations hooks protocol, available options are:
532 ## Push/Pull operations hooks protocol, available options are:
524 ## `http` - use http-rpc backend (default)
533 ## `http` - use http-rpc backend (default)
525 vcs.hooks.protocol = http
534 vcs.hooks.protocol = http
535 ## Host on which this instance is listening for hooks. If vcsserver is in other location
536 ## this should be adjusted.
537 vcs.hooks.host = 127.0.0.1
526
538
527 vcs.server.log_level = info
539 vcs.server.log_level = info
528 ## Start VCSServer with this instance as a subprocess, usefull for development
540 ## Start VCSServer with this instance as a subprocess, useful for development
529 vcs.start_server = false
541 vcs.start_server = false
530
542
531 ## List of enabled VCS backends, available options are:
543 ## List of enabled VCS backends, available options are:
@@ -608,7 +620,7 b' custom.conf = 1'
608 ### LOGGING CONFIGURATION ####
620 ### LOGGING CONFIGURATION ####
609 ################################
621 ################################
610 [loggers]
622 [loggers]
611 keys = root, sqlalchemy, beaker, rhodecode, ssh_wrapper, celery
623 keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
612
624
613 [handlers]
625 [handlers]
614 keys = console, console_sql
626 keys = console, console_sql
@@ -664,6 +676,9 b' level = INFO'
664 formatter = generic
676 formatter = generic
665
677
666 [handler_console_sql]
678 [handler_console_sql]
679 # "level = DEBUG" logs SQL queries and results.
680 # "level = INFO" logs SQL queries.
681 # "level = WARN" logs neither. (Recommended for production systems.)
667 class = StreamHandler
682 class = StreamHandler
668 args = (sys.stderr, )
683 args = (sys.stderr, )
669 level = WARN
684 level = WARN
@@ -685,5 +700,5 b' datefmt = %Y-%m-%d %H:%M:%S'
685
700
686 [formatter_color_formatter_sql]
701 [formatter_color_formatter_sql]
687 class = rhodecode.lib.logging_formatter.ColorFormatterSql
702 class = rhodecode.lib.logging_formatter.ColorFormatterSql
688 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
703 format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
689 datefmt = %Y-%m-%d %H:%M:%S
704 datefmt = %Y-%m-%d %H:%M:%S
@@ -1,41 +1,40 b''
1 # Nix environment for the community edition
1 # Nix environment for the community edition
2 #
2 #
3 # This shall be as lean as possible, just producing the Enterprise
3 # This shall be as lean as possible, just producing the enterprise-ce
4 # derivation. For advanced tweaks to pimp up the development environment we use
4 # derivation. For advanced tweaks to pimp up the development environment we use
5 # "shell.nix" so that it does not have to clutter this file.
5 # "shell.nix" so that it does not have to clutter this file.
6 #
7 # Configuration, set values in "~/.nixpkgs/config.nix".
8 # example
9 # {
10 # # Thoughts on how to configure the dev environment
11 # rc = {
12 # codeInternalUrl = "https://usr:token@internal-code.rhodecode.com";
13 # sources = {
14 # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver";
15 # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce";
16 # rhodecode-enterprise-ee = "/home/user/work/rhodecode-enterprise-ee";
17 # };
18 # };
19 # }
6
20
7 args@
21 args@
8 { pythonPackages ? "python27Packages"
22 { pythonPackages ? "python27Packages"
9 , pythonExternalOverrides ? self: super: {}
23 , pythonExternalOverrides ? self: super: {}
10 , doCheck ? true
24 , doCheck ? false
11 , ...
25 , ...
12 }:
26 }:
13
27
14 let
28 let
15
16 # Use nixpkgs from args or import them. We use this indirect approach
29 # Use nixpkgs from args or import them. We use this indirect approach
17 # through args to be able to use the name `pkgs` for our customized packages.
30 # through args to be able to use the name `pkgs` for our customized packages.
18 # Otherwise we will end up with an infinite recursion.
31 # Otherwise we will end up with an infinite recursion.
19 nixpkgs = args.pkgs or (import <nixpkgs> { });
32 pkgs = args.pkgs or (import <nixpkgs> { });
20
33
21 # johbo: Interim bridge which allows us to build with the upcoming
34 # Works with the new python-packages, still can fallback to the old
22 # nixos.16.09 branch (unstable at the moment of writing this note) and the
35 # variant.
23 # current stable nixos-16.03.
36 basePythonPackagesUnfix = basePythonPackages.__unfix__ or (
24 backwardsCompatibleFetchgit = { ... }@args:
37 self: basePythonPackages.override (a: { inherit self; }));
25 let
26 origSources = nixpkgs.fetchgit args;
27 in
28 nixpkgs.lib.overrideDerivation origSources (oldAttrs: {
29 NIX_PREFETCH_GIT_CHECKOUT_HOOK = ''
30 find $out -name '.git*' -print0 | xargs -0 rm -rf
31 '';
32 });
33
34 # Create a customized version of nixpkgs which should be used throughout the
35 # rest of this file.
36 pkgs = nixpkgs.overridePackages (self: super: {
37 fetchgit = backwardsCompatibleFetchgit;
38 });
39
38
40 # Evaluates to the last segment of a file system path.
39 # Evaluates to the last segment of a file system path.
41 basename = path: with pkgs.lib; last (splitString "/" path);
40 basename = path: with pkgs.lib; last (splitString "/" path);
@@ -46,7 +45,7 b' let'
46 ext = last (splitString "." path);
45 ext = last (splitString "." path);
47 in
46 in
48 !builtins.elem (basename path) [
47 !builtins.elem (basename path) [
49 ".git" ".hg" "__pycache__" ".eggs"
48 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
50 "bower_components" "node_modules"
49 "bower_components" "node_modules"
51 "build" "data" "result" "tmp"] &&
50 "build" "data" "result" "tmp"] &&
52 !builtins.elem ext ["egg-info" "pyc"] &&
51 !builtins.elem ext ["egg-info" "pyc"] &&
@@ -54,18 +53,20 b' let'
54 # it would still be good to restore it since we want to ignore "result-*".
53 # it would still be good to restore it since we want to ignore "result-*".
55 !hasPrefix "result" path;
54 !hasPrefix "result" path;
56
55
57 basePythonPackages = with builtins; if isAttrs pythonPackages
56 sources =
58 then pythonPackages
57 let
59 else getAttr pythonPackages pkgs;
58 inherit (pkgs.lib) all isString attrValues;
59 sourcesConfig = pkgs.config.rc.sources or {};
60 in
61 # Ensure that sources are configured as strings. Using a path
62 # would result in a copy into the nix store.
63 assert all isString (attrValues sourcesConfig);
64 sourcesConfig;
60
65
61 buildBowerComponents =
66 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
62 pkgs.buildBowerComponents or
63 (import ./pkgs/backport-16.03-build-bower-components.nix { inherit pkgs; });
64
65 sources = pkgs.config.rc.sources or {};
66 version = builtins.readFile ./rhodecode/VERSION;
67 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
67 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
68
68
69 buildBowerComponents = pkgs.buildBowerComponents;
69 nodeEnv = import ./pkgs/node-default.nix {
70 nodeEnv = import ./pkgs/node-default.nix {
70 inherit pkgs;
71 inherit pkgs;
71 };
72 };
@@ -77,133 +78,145 b' let'
77 src = rhodecode-enterprise-ce-src;
78 src = rhodecode-enterprise-ce-src;
78 };
79 };
79
80
80 pythonGeneratedPackages = self: basePythonPackages.override (a: {
81 rhodecode-testdata-src = sources.rhodecode-testdata or (
81 inherit self;
82 pkgs.fetchhg {
82 })
83 url = "https://code.rhodecode.com/upstream/rc_testdata";
83 // (scopedImport {
84 rev = "v0.10.0";
84 self = self;
85 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
85 super = basePythonPackages;
86 });
86 inherit pkgs;
87 inherit (pkgs) fetchurl fetchgit;
88 } ./pkgs/python-packages.nix);
89
87
90 pythonOverrides = import ./pkgs/python-packages-overrides.nix {
88 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
91 inherit
89 inherit
92 basePythonPackages
90 doCheck
93 pkgs;
91 pkgs
92 pythonPackages;
94 };
93 };
95
94
96 pythonLocalOverrides = self: super: {
95 pythonLocalOverrides = self: super: {
97 rhodecode-enterprise-ce =
96 rhodecode-enterprise-ce =
98 let
97 let
99 linkNodeAndBowerPackages = ''
98 linkNodeAndBowerPackages = ''
100 echo "Export RhodeCode CE path"
101 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
99 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
102 echo "Link node packages"
100
101 echo "[BEGIN]: Link node packages"
103 rm -fr node_modules
102 rm -fr node_modules
104 mkdir node_modules
103 mkdir node_modules
105 # johbo: Linking individual packages allows us to run "npm install"
104 # johbo: Linking individual packages allows us to run "npm install"
106 # inside of a shell to try things out. Re-entering the shell will
105 # inside of a shell to try things out. Re-entering the shell will
107 # restore a clean environment.
106 # restore a clean environment.
108 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
107 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
108 echo "[DONE]: Link node packages"
109
109
110 echo "DONE: Link node packages"
110 echo "[BEGIN]: Link bower packages"
111
112 echo "Link bower packages"
113 rm -fr bower_components
111 rm -fr bower_components
114 mkdir bower_components
112 mkdir bower_components
113 ln -s ${bowerComponents}/bower_components/* bower_components/
114 echo "[DONE]: Link bower packages"
115 '';
115
116
116 ln -s ${bowerComponents}/bower_components/* bower_components/
117 releaseName = "RhodeCodeEnterpriseCE-${version}";
117 echo "DONE: Link bower packages"
118 '';
119 in super.rhodecode-enterprise-ce.override (attrs: {
118 in super.rhodecode-enterprise-ce.override (attrs: {
120
121 inherit
119 inherit
122 doCheck
120 doCheck
123 version;
121 version;
122
124 name = "rhodecode-enterprise-ce-${version}";
123 name = "rhodecode-enterprise-ce-${version}";
125 releaseName = "RhodeCodeEnterpriseCE-${version}";
124 releaseName = releaseName;
126 src = rhodecode-enterprise-ce-src;
125 src = rhodecode-enterprise-ce-src;
127 dontStrip = true; # prevent strip, we don't need it.
126 dontStrip = true; # prevent strip, we don't need it.
128
127
129 buildInputs =
128 # expose following attributed outside
130 attrs.buildInputs ++
131 (with self; [
132 pkgs.nodePackages.bower
133 pkgs.nodePackages.grunt-cli
134 pkgs.subversion
135 pytest-catchlog
136 rhodecode-testdata
137 ]);
138
139 #TODO: either move this into overrides, OR use the new machanics from
140 # pip2nix and requiremtn.txt file
141 propagatedBuildInputs = attrs.propagatedBuildInputs ++ (with self; [
142 rhodecode-tools
143 ]);
144
145 # TODO: johbo: Make a nicer way to expose the parts. Maybe
146 # pkgs/default.nix?
147 passthru = {
129 passthru = {
148 inherit
130 inherit
131 rhodecode-testdata
149 bowerComponents
132 bowerComponents
150 linkNodeAndBowerPackages
133 linkNodeAndBowerPackages
151 myPythonPackagesUnfix
134 myPythonPackagesUnfix
152 pythonLocalOverrides;
135 pythonLocalOverrides
136 pythonCommunityOverrides;
137
153 pythonPackages = self;
138 pythonPackages = self;
154 };
139 };
155
140
141 buildInputs =
142 attrs.buildInputs or [] ++ [
143 rhodecode-testdata
144 pkgs.nodePackages.bower
145 pkgs.nodePackages.grunt-cli
146 ];
147
148 #NOTE: option to inject additional propagatedBuildInputs
149 propagatedBuildInputs =
150 attrs.propagatedBuildInputs or [] ++ [
151
152 ];
153
156 LC_ALL = "en_US.UTF-8";
154 LC_ALL = "en_US.UTF-8";
157 LOCALE_ARCHIVE =
155 LOCALE_ARCHIVE =
158 if pkgs.stdenv ? glibc
156 if pkgs.stdenv.isLinux
159 then "${pkgs.glibcLocales}/lib/locale/locale-archive"
157 then "${pkgs.glibcLocales}/lib/locale/locale-archive"
160 else "";
158 else "";
161
159
160 # Add bin directory to path so that tests can find 'rhodecode'.
162 preCheck = ''
161 preCheck = ''
163 export PATH="$out/bin:$PATH"
162 export PATH="$out/bin:$PATH"
164 '';
163 '';
165
164
165 # custom check phase for testing
166 checkPhase = ''
167 runHook preCheck
168 PYTHONHASHSEED=random py.test -vv -p no:sugar -r xw --cov-config=.coveragerc --cov=rhodecode --cov-report=term-missing rhodecode
169 runHook postCheck
170 '';
171
166 postCheck = ''
172 postCheck = ''
167 rm -rf $out/lib/${self.python.libPrefix}/site-packages/pytest_pylons
173 echo "Cleanup of rhodecode/tests"
168 rm -rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/tests
174 rm -rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/tests
169 '';
175 '';
170
176
171 preBuild = linkNodeAndBowerPackages + ''
177 preBuild = ''
178
179 echo "Building frontend assets"
180 ${linkNodeAndBowerPackages}
172 grunt
181 grunt
173 rm -fr node_modules
182 rm -fr node_modules
174 '';
183 '';
175
184
176 postInstall = ''
185 postInstall = ''
177 echo "Writing meta information for rccontrol to nix-support/rccontrol"
186 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
178 mkdir -p $out/nix-support/rccontrol
187 mkdir -p $out/nix-support/rccontrol
179 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
188 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
180 echo "DONE: Meta information for rccontrol written"
189 echo "[DONE]: enterprise-ce meta information for rccontrol written"
190
191 mkdir -p $out/etc
192 cp configs/production.ini $out/etc
193 echo "[DONE]: saved enterprise-ce production.ini into $out/etc"
181
194
182 # python based programs need to be wrapped
195 # python based programs need to be wrapped
196 mkdir -p $out/bin
197 # rhodecode-tools
198 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
199
200 # required binaries from dependencies
201 #ln -s ${self.python}/bin/python $out/bin
183 ln -s ${self.pyramid}/bin/* $out/bin/
202 ln -s ${self.pyramid}/bin/* $out/bin/
184 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
203 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
185 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
204 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
186 ln -s ${self.PasteScript}/bin/paster $out/bin/
205 ln -s ${self.pastescript}/bin/paster $out/bin/
187 ln -s ${self.channelstream}/bin/channelstream $out/bin/
206 ln -s ${self.channelstream}/bin/channelstream $out/bin/
188 ln -s ${self.celery}/bin/celery $out/bin/
207 ln -s ${self.celery}/bin/celery $out/bin/
208 echo "[DONE]: created symlinks into $out/bin"
189
209
190 # rhodecode-tools
191 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
192
193 # note that condition should be restricted when adding further tools
194 for file in $out/bin/*;
210 for file in $out/bin/*;
195 do
211 do
196 wrapProgram $file \
212 wrapProgram $file \
197 --prefix PATH : $PATH \
213 --prefix PATH : $PATH \
198 --prefix PYTHONPATH : $PYTHONPATH \
214 --prefix PYTHONPATH : $PYTHONPATH \
199 --set PYTHONHASHSEED random
215 --set PYTHONHASHSEED random
200 done
216 done
201
217
202 mkdir $out/etc
218 echo "[DONE]: enterprise-ce binary wrapping"
203 cp configs/production.ini $out/etc
204
219
205
206 # TODO: johbo: Make part of ac-tests
207 if [ ! -f rhodecode/public/js/scripts.js ]; then
220 if [ ! -f rhodecode/public/js/scripts.js ]; then
208 echo "Missing scripts.js"
221 echo "Missing scripts.js"
209 exit 1
222 exit 1
@@ -213,31 +226,33 b' let'
213 exit 1
226 exit 1
214 fi
227 fi
215 '';
228 '';
216
217 });
229 });
218
230
219 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
220 inherit
221 doCheck
222 pkgs
223 pythonPackages;
224 };
225
226 };
231 };
227
232
228 rhodecode-testdata-src = sources.rhodecode-testdata or (
233 basePythonPackages = with builtins;
229 pkgs.fetchhg {
234 if isAttrs pythonPackages then
230 url = "https://code.rhodecode.com/upstream/rc_testdata";
235 pythonPackages
231 rev = "v0.10.0";
236 else
232 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
237 getAttr pythonPackages pkgs;
233 });
238
239 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
240 inherit pkgs;
241 inherit (pkgs) fetchurl fetchgit fetchhg;
242 };
243
244 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
245 inherit pkgs basePythonPackages;
246 };
234
247
235 # Apply all overrides and fix the final package set
248 # Apply all overrides and fix the final package set
236 myPythonPackagesUnfix = with pkgs.lib;
249 myPythonPackagesUnfix = with pkgs.lib;
237 (extends pythonExternalOverrides
250 (extends pythonExternalOverrides
238 (extends pythonLocalOverrides
251 (extends pythonLocalOverrides
239 (extends pythonOverrides
252 (extends pythonCommunityOverrides
240 pythonGeneratedPackages)));
253 (extends pythonGeneratedPackages
254 basePythonPackagesUnfix))));
255
241 myPythonPackages = (pkgs.lib.fix myPythonPackagesUnfix);
256 myPythonPackages = (pkgs.lib.fix myPythonPackagesUnfix);
242
257
243 in myPythonPackages.rhodecode-enterprise-ce
258 in myPythonPackages.rhodecode-enterprise-ce
@@ -1,4 +1,9 b''
1 # generating packages
2 nix-shell pkgs/shell-generate.nix
3 cd docs
4 pip2nix generate
5
1 # building the docs
6 # building the docs
2 cd docs
7 cd docs
3 nix-build default.nix -o result
8 nix-build default.nix -o result
4 make clean html No newline at end of file
9 make clean html
@@ -88,17 +88,21 b' want to index:'
88 (venv)$ rhodecode-index --instance-name=enterprise-1
88 (venv)$ rhodecode-index --instance-name=enterprise-1
89
89
90 # Using default installation
90 # Using default installation
91 $ /home/user/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
91 $ /home/user/.rccontrol/enterprise-1/profile/bin/rhodecode-index \
92 --instance-name=enterprise-4
92 --instance-name=enterprise-1
93
93
94 # Using a custom mapping file
94 # Using a custom mapping file
95 $ /home/user/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
95 $ /home/user/.rccontrol/enterprise-1/profile/bin/rhodecode-index \
96 --instance-name=enterprise-4 \
96 --instance-name=enterprise-1 \
97 --mapping=/home/user/.rccontrol/enterprise-4/mapping.ini
97 --mapping=/home/user/.rccontrol/enterprise-1/mapping.ini
98
98
99 .. note::
99 .. note::
100
100
101 |RCT| require |PY| 2.7 to run.
101 In case of often indexing the index may become fragmented. Most often a result of that
102 is error about `too many open files`. To fix this indexer needs to be executed with
103 --optimize flag. E.g `rhodecode-index --instance-name=enterprise-1 --optimize`
104 This should be executed regularly, once a week is recommended.
105
102
106
103 .. _set-index:
107 .. _set-index:
104
108
@@ -12,7 +12,7 b' if there are lots of session files.'
12
12
13 Therefore, in a large scale deployment, to give better performance,
13 Therefore, in a large scale deployment, to give better performance,
14 scalability, and maintainability we recommend switching from file-based
14 scalability, and maintainability we recommend switching from file-based
15 sessions to database-based user sessions or memcached sessions.
15 sessions to database-based user sessions or Redis based sessions.
16
16
17 To switch to database-based user sessions uncomment the following section in
17 To switch to database-based user sessions uncomment the following section in
18 your :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
18 your :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
@@ -41,14 +41,20 b' and make sure you comment out the file b'
41 #beaker.session.data_dir = %(here)s/data/sessions/data
41 #beaker.session.data_dir = %(here)s/data/sessions/data
42
42
43
43
44 To switch to memcached-based user sessions uncomment the following section in
44 The `table_name` will be automatically created on specified database if it isn't yet existing.
45 Database specified in the `beaker.session.sa.url` can be the same that RhodeCode
46 uses, or if required it can be a different one. We recommend to use the same database.
47
48
49
50 To switch to reds-based user sessions uncomment the following section in
45 your :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
51 your :file:`/home/{user}/.rccontrol/{instance-id}/rhodecode.ini` file.
46
52
47 .. code-block:: ini
53 .. code-block:: ini
48
54
49 ## memcached sessions
55 ## redis sessions
50 beaker.session.type = ext:memcached
56 beaker.session.type = ext:redis
51 beaker.session.url = localhost:11211
57 beaker.session.url = localhost:6379
52
58
53
59
54 and make sure you comment out the file based sessions.
60 and make sure you comment out the file based sessions.
@@ -83,7 +83,7 b' comment_pull_request'
83 create_pull_request
83 create_pull_request
84 -------------------
84 -------------------
85
85
86 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, title, description=<Optional:''>, reviewers=<Optional:None>)
86 .. py:function:: create_pull_request(apiuser, source_repo, target_repo, source_ref, target_ref, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>)
87
87
88 Creates a new pull request.
88 Creates a new pull request.
89
89
@@ -104,10 +104,14 b' create_pull_request'
104 :type source_ref: str
104 :type source_ref: str
105 :param target_ref: Set the target ref name.
105 :param target_ref: Set the target ref name.
106 :type target_ref: str
106 :type target_ref: str
107 :param title: Set the pull request title.
107 :param title: Optionally Set the pull request title, it's generated otherwise
108 :type title: str
108 :type title: str
109 :param description: Set the pull request description.
109 :param description: Set the pull request description.
110 :type description: Optional(str)
110 :type description: Optional(str)
111 :type description_renderer: Optional(str)
112 :param description_renderer: Set pull request renderer for the description.
113 It should be 'rst', 'markdown' or 'plain'. If not give default
114 system renderer will be used
111 :param reviewers: Set the new pull request reviewers list.
115 :param reviewers: Set the new pull request reviewers list.
112 Reviewer defined by review rules will be added automatically to the
116 Reviewer defined by review rules will be added automatically to the
113 defined list.
117 defined list.
@@ -368,7 +372,7 b' merge_pull_request'
368 update_pull_request
372 update_pull_request
369 -------------------
373 -------------------
370
374
371 .. py:function:: update_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, title=<Optional:''>, description=<Optional:''>, reviewers=<Optional:None>, update_commits=<Optional:None>)
375 .. py:function:: update_pull_request(apiuser, pullrequestid, repoid=<Optional:None>, title=<Optional:''>, description=<Optional:''>, description_renderer=<Optional:''>, reviewers=<Optional:None>, update_commits=<Optional:None>)
372
376
373 Updates a pull request.
377 Updates a pull request.
374
378
@@ -382,6 +386,9 b' update_pull_request'
382 :type title: str
386 :type title: str
383 :param description: Update pull request description.
387 :param description: Update pull request description.
384 :type description: Optional(str)
388 :type description: Optional(str)
389 :type description_renderer: Optional(str)
390 :param description_renderer: Update pull request renderer for the description.
391 It should be 'rst', 'markdown' or 'plain'
385 :param reviewers: Update pull request reviewers list with new value.
392 :param reviewers: Update pull request reviewers list with new value.
386 :type reviewers: Optional(list)
393 :type reviewers: Optional(list)
387 Accepts username strings or objects of the format:
394 Accepts username strings or objects of the format:
@@ -32,6 +32,7 b' import common'
32 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
32 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
33 # ones.
33 # ones.
34 extensions = [
34 extensions = [
35 'sphinx.ext.autodoc',
35 'sphinx.ext.intersphinx',
36 'sphinx.ext.intersphinx',
36 'sphinx.ext.todo',
37 'sphinx.ext.todo',
37 'sphinx.ext.imgmath'
38 'sphinx.ext.imgmath'
@@ -42,13 +43,6 b' intersphinx_mapping = {'
42 'control': ('https://docs.rhodecode.com/RhodeCode-Control/', None),
43 'control': ('https://docs.rhodecode.com/RhodeCode-Control/', None),
43 }
44 }
44
45
45 if tags.has('dev'):
46 intersphinx_mapping.update({
47 'enterprise': ('https://ci.rhodecode.com/documentation/Momentum/', None),
48 'control': ('https://ci.rhodecode.com/documentation/Control/', None),
49 })
50
51
52 # Add any paths that contain templates here, relative to this directory.
46 # Add any paths that contain templates here, relative to this directory.
53 templates_path = ['_templates']
47 templates_path = ['_templates']
54
48
@@ -65,11 +59,12 b" master_doc = 'index'"
65 # |version| and |release|, also used in various other places throughout the
59 # |version| and |release|, also used in various other places throughout the
66 # built documents.
60 # built documents.
67
61
68 # TODO: johbo: Move into common package for documentation utilities
62
69 def _get_version():
63 def _get_version():
70 with open('../rhodecode/VERSION') as f:
64 with open('../rhodecode/VERSION') as f:
71 return f.read().strip()
65 return f.read().strip()
72
66
67
73 # The full version, including alpha/beta/rc tags.
68 # The full version, including alpha/beta/rc tags.
74 release = _get_version()
69 release = _get_version()
75 # The short X.Y version.
70 # The short X.Y version.
@@ -47,7 +47,7 b' Switch nix to the latest STABLE channel'
47
47
48 run::
48 run::
49
49
50 nix-channel --add https://nixos.org/channels/nixos-16.03 nixpkgs
50 nix-channel --add https://nixos.org/channels/nixos-18.03 nixpkgs
51
51
52 Followed by::
52 Followed by::
53
53
@@ -5,249 +5,215 b' let'
5
5
6 pkgs = import <nixpkgs> { inherit system; };
6 pkgs = import <nixpkgs> { inherit system; };
7
7
8 inherit (pkgs) fetchurl fetchgit;
8 inherit (pkgs) fetchurl;
9
9
10 buildPythonPackage = pkgs.python27Packages.buildPythonPackage;
10 buildPythonPackage = pkgs.python27Packages.buildPythonPackage;
11 python = pkgs.python27Packages.python;
11 python = pkgs.python27Packages.python;
12
12
13 Jinja2 = buildPythonPackage rec {
13
14 name = "Jinja2-2.9.6";
14 alabaster = buildPythonPackage {
15 buildInputs = [];
15 name = "alabaster-0.7.11";
16 doCheck = false;
17 src = fetchurl {
18 url = "https://files.pythonhosted.org/packages/3f/46/9346ea429931d80244ab7f11c4fce83671df0b7ae5a60247a2b588592c46/alabaster-0.7.11.tar.gz";
19 sha256 = "1mvm69xsn5xf1jc45kdq1mn0yq0pfn54mv2jcww4s1vwqx6iyfxn";
20 };
21 };
22 babel = buildPythonPackage {
23 name = "babel-2.6.0";
16 doCheck = false;
24 doCheck = false;
17 propagatedBuildInputs = [MarkupSafe];
25 propagatedBuildInputs = [
26 pytz
27 ];
28 src = fetchurl {
29 url = "https://files.pythonhosted.org/packages/be/cc/9c981b249a455fa0c76338966325fc70b7265521bad641bf2932f77712f4/Babel-2.6.0.tar.gz";
30 sha256 = "08rxmbx2s4irp0w0gmn498vns5xy0fagm0fg33xa772jiks51flc";
31 };
32 };
33 certifi = buildPythonPackage {
34 name = "certifi-2018.8.24";
35 doCheck = false;
18 src = fetchurl {
36 src = fetchurl {
19 url = "https://pypi.python.org/packages/90/61/f820ff0076a2599dd39406dcb858ecb239438c02ce706c8e91131ab9c7f1/Jinja2-2.9.6.tar.gz";
37 url = "https://files.pythonhosted.org/packages/e1/0f/f8d5e939184547b3bdc6128551b831a62832713aa98c2ccdf8c47ecc7f17/certifi-2018.8.24.tar.gz";
20 md5 = "6411537324b4dba0956aaa8109f3c77b";
38 sha256 = "0f0nhrj9mlrf79iway4578wrsgmjh0fmacl9zv8zjckdy7b90rip";
39 };
40 };
41 chardet = buildPythonPackage {
42 name = "chardet-3.0.4";
43 doCheck = false;
44 src = fetchurl {
45 url = "https://files.pythonhosted.org/packages/fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d/chardet-3.0.4.tar.gz";
46 sha256 = "1bpalpia6r5x1kknbk11p1fzph56fmmnp405ds8icksd3knr5aw4";
47 };
48 };
49 docutils = buildPythonPackage {
50 name = "docutils-0.14";
51 doCheck = false;
52 src = fetchurl {
53 url = "https://files.pythonhosted.org/packages/84/f4/5771e41fdf52aabebbadecc9381d11dea0fa34e4759b4071244fa094804c/docutils-0.14.tar.gz";
54 sha256 = "0x22fs3pdmr42kvz6c654756wja305qv6cx1zbhwlagvxgr4xrji";
21 };
55 };
22 };
56 };
23
57 idna = buildPythonPackage {
24 MarkupSafe = buildPythonPackage rec {
58 name = "idna-2.7";
25 name = "MarkupSafe-1.0";
59 doCheck = false;
26 buildInputs = [];
60 src = fetchurl {
61 url = "https://files.pythonhosted.org/packages/65/c4/80f97e9c9628f3cac9b98bfca0402ede54e0563b56482e3e6e45c43c4935/idna-2.7.tar.gz";
62 sha256 = "05jam7d31767dr12x0rbvvs8lxnpb1mhdb2zdlfxgh83z6k3hjk8";
63 };
64 };
65 imagesize = buildPythonPackage {
66 name = "imagesize-1.1.0";
27 doCheck = false;
67 doCheck = false;
28 propagatedBuildInputs = [];
29 src = fetchurl {
68 src = fetchurl {
30 url = "https://pypi.python.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz";
69 url = "https://files.pythonhosted.org/packages/41/f5/3cf63735d54aa9974e544aa25858d8f9670ac5b4da51020bbfc6aaade741/imagesize-1.1.0.tar.gz";
31 md5 = "2fcedc9284d50e577b5192e8e3578355";
70 sha256 = "1dg3wn7qpwmhgqc0r9na2ding1wif9q5spz3j9zn2riwphc2k0zk";
71 };
72 };
73 jinja2 = buildPythonPackage {
74 name = "jinja2-2.9.6";
75 doCheck = false;
76 propagatedBuildInputs = [
77 markupsafe
78 ];
79 src = fetchurl {
80 url = "https://files.pythonhosted.org/packages/90/61/f820ff0076a2599dd39406dcb858ecb239438c02ce706c8e91131ab9c7f1/Jinja2-2.9.6.tar.gz";
81 sha256 = "1zzrkywhziqffrzks14kzixz7nd4yh2vc0fb04a68vfd2ai03anx";
32 };
82 };
33 };
83 };
34
84 markupsafe = buildPythonPackage {
35 Pygments = buildPythonPackage {
85 name = "markupsafe-1.0";
36 name = "Pygments-2.2.0";
86 doCheck = false;
37 buildInputs = [];
87 src = fetchurl {
88 url = "https://files.pythonhosted.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz";
89 sha256 = "0rdn1s8x9ni7ss8rfiacj7x1085lx8mh2zdwqslnw8xc3l4nkgm6";
90 };
91 };
92 packaging = buildPythonPackage {
93 name = "packaging-17.1";
38 doCheck = false;
94 doCheck = false;
39 propagatedBuildInputs = [];
95 propagatedBuildInputs = [
96 pyparsing
97 six
98 ];
40 src = fetchurl {
99 src = fetchurl {
41 url = "https://pypi.python.org/packages/71/2a/2e4e77803a8bd6408a2903340ac498cb0a2181811af7c9ec92cb70b0308a/Pygments-2.2.0.tar.gz";
100 url = "https://files.pythonhosted.org/packages/77/32/439f47be99809c12ef2da8b60a2c47987786d2c6c9205549dd6ef95df8bd/packaging-17.1.tar.gz";
42 md5 = "13037baca42f16917cbd5ad2fab50844";
101 sha256 = "0nrpayk8kij1zm9sjnk38ldz3a6705ggvw8ljylqbrb4vmqbf6gh";
102 };
103 };
104 pygments = buildPythonPackage {
105 name = "pygments-2.2.0";
106 doCheck = false;
107 src = fetchurl {
108 url = "https://files.pythonhosted.org/packages/71/2a/2e4e77803a8bd6408a2903340ac498cb0a2181811af7c9ec92cb70b0308a/Pygments-2.2.0.tar.gz";
109 sha256 = "1k78qdvir1yb1c634nkv6rbga8wv4289xarghmsbbvzhvr311bnv";
43 };
110 };
44 };
111 };
45
112 pyparsing = buildPythonPackage {
46 Sphinx = buildPythonPackage (rec {
113 name = "pyparsing-2.2.0";
47 name = "Sphinx-1.6.5";
114 doCheck = false;
48 src = fetchurl {
115 src = fetchurl {
49 url = "https://pypi.python.org/packages/8b/7e/b188d9a3b9c938e736e02a74c1363c2888e095d770df2c72b4c312f9fdcb/Sphinx-1.6.5.tar.gz";
116 url = "https://files.pythonhosted.org/packages/3c/ec/a94f8cf7274ea60b5413df054f82a8980523efd712ec55a59e7c3357cf7c/pyparsing-2.2.0.tar.gz";
50 md5 = "cd73118c21ec610432e63e6421ec54f1";
117 sha256 = "016b9gh606aa44sq92jslm89bg874ia0yyiyb643fa6dgbsbqch8";
51 };
118 };
119 };
120 pytz = buildPythonPackage {
121 name = "pytz-2018.4";
122 doCheck = false;
123 src = fetchurl {
124 url = "https://files.pythonhosted.org/packages/10/76/52efda4ef98e7544321fd8d5d512e11739c1df18b0649551aeccfb1c8376/pytz-2018.4.tar.gz";
125 sha256 = "0jgpqx3kk2rhv81j1izjxvmx8d0x7hzs1857pgqnixic5wq2ar60";
126 };
127 };
128 requests = buildPythonPackage {
129 name = "requests-2.19.1";
130 doCheck = false;
52 propagatedBuildInputs = [
131 propagatedBuildInputs = [
53 six
132 chardet
54 Jinja2
133 idna
55 Pygments
134 urllib3
56 docutils
135 certifi
57 snowballstemmer
58 babel
59 alabaster
60 imagesize
61 requests
62 setuptools
63 sphinxcontrib-websupport
64 typing
65
66 # special cases
67 pytz
68 sphinx_rtd_theme
69
70 ];
136 ];
71 });
137 src = fetchurl {
72
138 url = "https://files.pythonhosted.org/packages/54/1f/782a5734931ddf2e1494e4cd615a51ff98e1879cbe9eecbdfeaf09aa75e9/requests-2.19.1.tar.gz";
73 alabaster = buildPythonPackage rec {
139 sha256 = "0snf8xxdzsgh1x2zv3vilvbrv9jbpmnfagzzb1rjmmvflckdh8pc";
74 name = "alabaster-0.7.10";
140 };
75 buildInputs = [];
141 };
142 six = buildPythonPackage {
143 name = "six-1.11.0";
76 doCheck = false;
144 doCheck = false;
77 propagatedBuildInputs = [];
78 src = fetchurl {
145 src = fetchurl {
79 url = "https://pypi.python.org/packages/d0/a5/e3a9ad3ee86aceeff71908ae562580643b955ea1b1d4f08ed6f7e8396bd7/alabaster-0.7.10.tar.gz";
146 url = "https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz";
80 md5 = "7934dccf38801faa105f6e7b4784f493";
147 sha256 = "1scqzwc51c875z23phj48gircqjgnn3af8zy2izjwmnlxrxsgs3h";
148 };
149 };
150 snowballstemmer = buildPythonPackage {
151 name = "snowballstemmer-1.2.1";
152 doCheck = false;
153 src = fetchurl {
154 url = "https://files.pythonhosted.org/packages/20/6b/d2a7cb176d4d664d94a6debf52cd8dbae1f7203c8e42426daa077051d59c/snowballstemmer-1.2.1.tar.gz";
155 sha256 = "0a0idq4y5frv7qsg2x62jd7rd272749xk4x99misf5rcifk2d7wi";
81 };
156 };
82 };
157 };
83
158 sphinx = buildPythonPackage {
84 babel = buildPythonPackage {
159 name = "sphinx-1.7.8";
85 name = "babel-2.5.1";
86 buildInputs = [];
87 doCheck = false;
160 doCheck = false;
88 propagatedBuildInputs = [pytz];
161 propagatedBuildInputs = [
162 six
163 jinja2
164 pygments
165 docutils
166 snowballstemmer
167 babel
168 alabaster
169 imagesize
170 requests
171 setuptools
172 packaging
173 sphinxcontrib-websupport
174 typing
175 ];
89 src = fetchurl {
176 src = fetchurl {
90 url = "https://pypi.python.org/packages/5a/22/63f1dbb8514bb7e0d0c8a85cc9b14506599a075e231985f98afd70430e1f/Babel-2.5.1.tar.gz";
177 url = "https://files.pythonhosted.org/packages/ac/54/4ef326d0c654da1ed91341a7a1f43efc18a8c770ddd2b8e45df97cb79d82/Sphinx-1.7.8.tar.gz";
91 md5 = "60228b3ce93a203357158b909afe8ae1";
178 sha256 = "1ryz0w4c31930f1br2sjwrxwx9cmsy7cqdb0d81g98n9bj250w50";
92 };
179 };
93 };
180 };
94
181 sphinx-rtd-theme = buildPythonPackage {
95 certifi = buildPythonPackage {
182 name = "sphinx-rtd-theme-0.4.1";
96 name = "certifi-2017.11.5";
97 buildInputs = [];
98 doCheck = false;
183 doCheck = false;
99 propagatedBuildInputs = [];
184 propagatedBuildInputs = [
185 sphinx
186 ];
100 src = fetchurl {
187 src = fetchurl {
101 url = "https://pypi.python.org/packages/23/3f/8be01c50ed24a4bd6b8da799839066ce0288f66f5e11f0367323467f0cbc/certifi-2017.11.5.tar.gz";
188 url = "https://files.pythonhosted.org/packages/f2/b0/a1933d792b806118ddbca6699f2e2c844d9b1b16e84a89d7effd5cd2a800/sphinx_rtd_theme-0.4.1.tar.gz";
102 md5 = "c15ac46ed1fe4b607ff3405928f9a992";
189 sha256 = "1xkyqam8dzbjaymdyvkiif85m4y3jf8crdiwlgcfp8gqcj57aj9v";
103 };
190 };
104 };
191 };
105
192 sphinxcontrib-websupport = buildPythonPackage {
106 chardet = buildPythonPackage {
193 name = "sphinxcontrib-websupport-1.1.0";
107 name = "chardet-3.0.4";
108 buildInputs = [];
109 doCheck = false;
194 doCheck = false;
110 propagatedBuildInputs = [];
111 src = fetchurl {
195 src = fetchurl {
112 url = "https://pypi.python.org/packages/fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d/chardet-3.0.4.tar.gz";
196 url = "https://files.pythonhosted.org/packages/07/7a/e74b06dce85555ffee33e1d6b7381314169ebf7e31b62c18fcb2815626b7/sphinxcontrib-websupport-1.1.0.tar.gz";
113 md5 = "7dd1ba7f9c77e32351b0a0cfacf4055c";
197 sha256 = "1ff3ix76xi1y6m99qxhaq5161ix9swwzydilvdya07mgbcvpzr4x";
114 };
198 };
115 };
199 };
116
200 typing = buildPythonPackage {
117 docutils = buildPythonPackage {
201 name = "typing-3.6.6";
118 name = "docutils-0.14";
119 buildInputs = [];
120 doCheck = false;
202 doCheck = false;
121 propagatedBuildInputs = [];
122 src = fetchurl {
203 src = fetchurl {
123 url = "https://pypi.python.org/packages/84/f4/5771e41fdf52aabebbadecc9381d11dea0fa34e4759b4071244fa094804c/docutils-0.14.tar.gz";
204 url = "https://files.pythonhosted.org/packages/bf/9b/2bf84e841575b633d8d91ad923e198a415e3901f228715524689495b4317/typing-3.6.6.tar.gz";
124 md5 = "c53768d63db3873b7d452833553469de";
205 sha256 = "0ba9acs4awx15bf9v3nrs781msbd2nx826906nj6fqks2bvca9s0";
206 };
207 };
208 urllib3 = buildPythonPackage {
209 name = "urllib3-1.23";
210 doCheck = false;
211 src = fetchurl {
212 url = "https://files.pythonhosted.org/packages/3c/d2/dc5471622bd200db1cd9319e02e71bc655e9ea27b8e0ce65fc69de0dac15/urllib3-1.23.tar.gz";
213 sha256 = "1bvbd35q3zdcd7gsv38fwpizy7p06dr0154g5gfybrvnbvhwb2m6";
125 };
214 };
126 };
215 };
127
216
128 idna = buildPythonPackage {
129 name = "idna-2.6";
130 buildInputs = [];
131 doCheck = false;
132 propagatedBuildInputs = [];
133 src = fetchurl {
134 url = "https://pypi.python.org/packages/f4/bd/0467d62790828c23c47fc1dfa1b1f052b24efdf5290f071c7a91d0d82fd3/idna-2.6.tar.gz";
135 md5 = "c706e2790b016bd0ed4edd2d4ba4d147";
136 };
137 };
138
139 imagesize = buildPythonPackage {
140 name = "imagesize-0.7.1";
141 buildInputs = [];
142 doCheck = false;
143 propagatedBuildInputs = [];
144 src = fetchurl {
145 url = "https://pypi.python.org/packages/53/72/6c6f1e787d9cab2cc733cf042f125abec07209a58308831c9f292504e826/imagesize-0.7.1.tar.gz";
146 md5 = "976148283286a6ba5f69b0f81aef8052";
147 };
148 };
149
150 pytz = buildPythonPackage {
151 name = "pytz-2017.3";
152 buildInputs = [];
153 doCheck = false;
154 propagatedBuildInputs = [];
155 src = fetchurl {
156 url = "https://pypi.python.org/packages/60/88/d3152c234da4b2a1f7a989f89609ea488225eaea015bc16fbde2b3fdfefa/pytz-2017.3.zip";
157 md5 = "7006b56c0d68a162d9fe57d4249c3171";
158 };
159 };
160
161 requests = buildPythonPackage {
162 name = "requests-2.18.4";
163 buildInputs = [];
164 doCheck = false;
165 propagatedBuildInputs = [chardet idna urllib3 certifi];
166 src = fetchurl {
167 url = "https://pypi.python.org/packages/b0/e1/eab4fc3752e3d240468a8c0b284607899d2fbfb236a56b7377a329aa8d09/requests-2.18.4.tar.gz";
168 md5 = "081412b2ef79bdc48229891af13f4d82";
169 };
170 };
171
172 six = buildPythonPackage {
173 name = "six-1.11.0";
174 buildInputs = [];
175 doCheck = false;
176 propagatedBuildInputs = [];
177 src = fetchurl {
178 url = "https://pypi.python.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz";
179 md5 = "d12789f9baf7e9fb2524c0c64f1773f8";
180 };
181 };
182
183 snowballstemmer = buildPythonPackage {
184 name = "snowballstemmer-1.2.1";
185 buildInputs = [];
186 doCheck = false;
187 propagatedBuildInputs = [];
188 src = fetchurl {
189 url = "https://pypi.python.org/packages/20/6b/d2a7cb176d4d664d94a6debf52cd8dbae1f7203c8e42426daa077051d59c/snowballstemmer-1.2.1.tar.gz";
190 md5 = "643b019667a708a922172e33a99bf2fa";
191 };
192 };
193
194 sphinx-rtd-theme = buildPythonPackage {
195 name = "sphinx-rtd-theme-0.2.5b1";
196 buildInputs = [];
197 doCheck = false;
198 propagatedBuildInputs = [];
199 src = fetchurl {
200 url = "https://pypi.python.org/packages/59/e4/9e3a74a3271e6734911d3f549e8439db53b8ac29adf10c8f698e6c86246b/sphinx_rtd_theme-0.2.5b1.tar.gz";
201 md5 = "0923473a43bd2527f32151f195f2a521";
202 };
203 };
204
205 sphinxcontrib-websupport = buildPythonPackage {
206 name = "sphinxcontrib-websupport-1.0.1";
207 buildInputs = [];
208 doCheck = false;
209 propagatedBuildInputs = [];
210 src = fetchurl {
211 url = "https://pypi.python.org/packages/c5/6b/f0630436b931ad4f8331a9399ca18a7d447f0fcc0c7178fb56b1aee68d01/sphinxcontrib-websupport-1.0.1.tar.gz";
212 md5 = "84df26463b1ba65b07f926dbe2055665";
213 };
214 };
215
216 typing = buildPythonPackage {
217 name = "typing-3.6.2";
218 buildInputs = [];
219 doCheck = false;
220 propagatedBuildInputs = [];
221 src = fetchurl {
222 url = "https://pypi.python.org/packages/ca/38/16ba8d542e609997fdcd0214628421c971f8c395084085354b11ff4ac9c3/typing-3.6.2.tar.gz";
223 md5 = "143af0bf3afd1887622771f2f1ffe8e1";
224 };
225 };
226
227 urllib3 = buildPythonPackage {
228 name = "urllib3-1.22";
229 buildInputs = [];
230 doCheck = false;
231 propagatedBuildInputs = [];
232 src = fetchurl {
233 url = "https://pypi.python.org/packages/ee/11/7c59620aceedcc1ef65e156cc5ce5a24ef87be4107c2b74458464e437a5d/urllib3-1.22.tar.gz";
234 md5 = "0da7bed3fe94bf7dc59ae37885cc72f7";
235 };
236 };
237
238
239 sphinx_rtd_theme = buildPythonPackage rec {
240 name = "sphinx-rtd-theme-0.2.5b1";
241 buildInputs = [];
242 doCheck = false;
243 propagatedBuildInputs = [];
244 src = fetchurl {
245 url = "https://pypi.python.org/packages/59/e4/9e3a74a3271e6734911d3f549e8439db53b8ac29adf10c8f698e6c86246b/sphinx_rtd_theme-0.2.5b1.tar.gz";
246 md5 = "0923473a43bd2527f32151f195f2a521";
247 };
248
249
250 };
251 # Avoid that setuptools is replaced, this leads to trouble
217 # Avoid that setuptools is replaced, this leads to trouble
252 # with buildPythonPackage.
218 # with buildPythonPackage.
253 setuptools = pkgs.python27Packages.setuptools;
219 setuptools = pkgs.python27Packages.setuptools;
@@ -255,7 +221,7 b' let'
255 in python.buildEnv.override {
221 in python.buildEnv.override {
256 inherit python;
222 inherit python;
257 extraLibs = [
223 extraLibs = [
258 Sphinx
224 sphinx
259 sphinx_rtd_theme
225 sphinx-rtd-theme
260 ];
226 ];
261 }
227 } No newline at end of file
@@ -37,6 +37,7 b' To convert the old version into a curren'
37 |repo| into a local machine using a recent |git| client, then push it to a new
37 |repo| into a local machine using a recent |git| client, then push it to a new
38 |repo| inside |RCE|.
38 |repo| inside |RCE|.
39
39
40
40 VCS Server Memory Consumption
41 VCS Server Memory Consumption
41 -----------------------------
42 -----------------------------
42
43
@@ -48,24 +49,34 b' shipped with the optimal configuration a'
48 To fix this issue, upgrade to |RCE| 3.3.2 or greater, and if you discover
49 To fix this issue, upgrade to |RCE| 3.3.2 or greater, and if you discover
49 memory consumption issues check the VCS Server settings.
50 memory consumption issues check the VCS Server settings.
50
51
51 Fedora 23
52 Fedora 23 / Ubuntu 18.04
52 ---------
53 ------------------------
54
55 |RCC| has a know problem with locales, due to changes in glibc 2.27+ which affects
56 the local-archive format, which is now incompatible with our used glibc 2.26.
57
53
58
54 |RCC| does not run perfectly on Fedora 23 due to a locale issue. This is a
59 To work around this problem, you need set path to ``$LOCAL_ARCHIVE`` to the
55 known issue under investigation due to the Nix packaging of the product, see the
60 locale package in older pre glibc 2.27 format, or set `LC_ALL=C` in your enviroment.
56 `Github issue here`_. |RCC| runs fine on Fedora 21.
61
62 To use the pre 2.27 locale-archive fix follow these steps:
57
63
58 To work around this problem, you need to point ``$LOCAL_ARCHIVE`` to the
64 1. Download the pre 2.27 locale-archive package
59 workaround locale package.
60
65
61 1. Download this package:
66 .. code-block:: bash
62 http://lipa.ms.mff.cuni.cz/~cunav5am/nix/locale-archive
67
68 wget https://dls.rhodecode.com/assets/locale-archive
69
63
70
64 2. Point ``$LOCAL_ARCHIVE`` to the locale package.
71 2. Point ``$LOCAL_ARCHIVE`` to the locale package.
65
72
66 .. code-block:: bash
73 .. code-block:: bash
67
74
68 $ export LOCALE_ARCHIVE=/home/VERSION/locale-archive # change to your path
75 $ export LOCALE_ARCHIVE=/home/USER/locale-archive # change to your path
76
77 This can either added in `~/.rccontrol/supervisor/supervisord.ini`
78 or in user .bashrc/.zshrc etc, or via a startup script that
79 runs `rccontrol self-init`
69
80
70 If you happen to be running |RCC| from systemd, use the following
81 If you happen to be running |RCC| from systemd, use the following
71 example to pass the correct locale information on boot.
82 example to pass the correct locale information on boot.
@@ -85,4 +96,3 b' example to pass the correct locale infor'
85 [Install]
96 [Install]
86 WantedBy=multi-user.target
97 WantedBy=multi-user.target
87
98
88 .. _Github issue here: https://github.com/NixOS/nix/issues/599
@@ -9,6 +9,7 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.13.0.rst
12 release-notes-4.12.4.rst
13 release-notes-4.12.4.rst
13 release-notes-4.12.3.rst
14 release-notes-4.12.3.rst
14 release-notes-4.12.2.rst
15 release-notes-4.12.2.rst
@@ -1,8 +1,8 b''
1 Sphinx==1.6.5
1 sphinx==1.7.8
2 six==1.11.0
2 six==1.11.0
3 sphinx_rtd_theme==0.2.5b1
3 sphinx_rtd_theme==0.4.1
4 docutils==0.14.0
4 docutils==0.14.0
5 Pygments==2.2.0
5 pygments==2.2.0
6 MarkupSafe==1.0.0
6 markupsafe==1.0.0
7 Jinja2==2.9.6
7 jinja2==2.9.6
8 pytz No newline at end of file
8 pytz==2018.4
@@ -1,6 +1,13 b''
1 {
1 {
2 "name": "rhodecode-enterprise",
2 "name": "rhodecode-enterprise",
3 "version": "0.0.1",
3 "version": "1.0.0",
4 "private": true,
5 "description" : "RhodeCode JS packaged",
6 "license": "SEE LICENSE IN LICENSE.txt",
7 "repository" : {
8 "type" : "hg",
9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 },
4 "devDependencies": {
11 "devDependencies": {
5 "grunt": "^0.4.5",
12 "grunt": "^0.4.5",
6 "grunt-contrib-copy": "^1.0.0",
13 "grunt-contrib-copy": "^1.0.0",
@@ -8,16 +15,17 b''
8 "grunt-contrib-jshint": "^0.12.0",
15 "grunt-contrib-jshint": "^0.12.0",
9 "grunt-contrib-less": "^1.1.0",
16 "grunt-contrib-less": "^1.1.0",
10 "grunt-contrib-watch": "^0.6.1",
17 "grunt-contrib-watch": "^0.6.1",
11 "crisper": "^2.0.2",
18 "crisper": "^2.1.1",
12 "vulcanize": "^1.14.8",
19 "vulcanize": "^1.16.0",
13 "grunt-crisper": "^1.0.1",
20 "grunt-crisper": "^1.0.1",
14 "grunt-vulcanize": "^1.0.0",
21 "grunt-vulcanize": "^1.0.0",
15 "node2nix": "^1.0.0",
22 "node2nix": "^1.0.0",
16 "jshint": "^2.9.1-rc3",
23 "jshint": "^2.9.1-rc3",
17 "bower": "^1.7.9",
24 "bower": "^1.8.4",
18 "jquery": "1.11.3",
25 "jquery": "1.11.3",
19 "favico.js": "^0.3.10",
26 "favico.js": "^0.3.10",
20 "clipboard": "^1.7.1",
27 "clipboard": "^2.0.1",
28 "qrious": "^4.0.2",
21 "moment": "^2.18.1",
29 "moment": "^2.18.1",
22 "mousetrap": "^1.6.1",
30 "mousetrap": "^1.6.1",
23 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
31 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
@@ -1,33 +1,30 b''
1 # Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
1 { fetchbower, buildEnv }:
2 { fetchbower, buildEnv }:
2 buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
3 buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
3 (fetchbower "webcomponentsjs" "0.7.22" "^0.7.22" "178h9j8jq9wi5845f5pxhhhqw6x022nzmpzm4di8fgsdl1f6nr5d")
4 (fetchbower "webcomponentsjs" "1.2.3" "^1.2.3" "0db2fjk779rhl9d4ifpk1j9a83vngx6j3hk7si1752dqxj857267")
4 (fetchbower "polymer" "Polymer/polymer#1.6.1" "Polymer/polymer#^1.6.1" "09mm0jgk457gvwqlc155swch7gjr6fs3g7spnvhi6vh5b6518540")
5 (fetchbower "polymer" "Polymer/polymer#2.6.0" "Polymer/polymer#^2.6.0" "1jw5syjn0naa7dlxzxvsgwb20zbkbpx0pcg0wzjq4wr49c20nw0k")
5 (fetchbower "paper-button" "PolymerElements/paper-button#1.0.13" "PolymerElements/paper-button#^1.0.13" "0i3y153nqk06pn0gk282vyybnl3g1w3w41d5i9z659cgn27g3fvm")
6 (fetchbower "paper-button" "PolymerElements/paper-button#2.1.2" "PolymerElements/paper-button#^2.1.2" "1lwmjwhvimh02gss39yjp5h7yg9mxl1ig59yrk085v86y5f5ilz1")
6 (fetchbower "paper-spinner" "PolymerElements/paper-spinner#1.2.0" "PolymerElements/paper-spinner#^1.2.0" "1av1m6y81jw3hjhz1yqy3rwcgxarjzl58ldfn4q6sn51pgzngfqb")
7 (fetchbower "paper-spinner" "PolymerElements/paper-spinner#2.1.0" "PolymerElements/paper-spinner#^2.1.0" "07jamgxzvy4r9pgf5ikj1fm8nkrw6sywgcxvmm7ax58hjvmd4i45")
7 (fetchbower "paper-tooltip" "PolymerElements/paper-tooltip#1.1.3" "PolymerElements/paper-tooltip#^1.1.2" "0vmrm1n8k9sk9nvqy03q177axy22pia6i3j1gxbk72j3pqiqvg6k")
8 (fetchbower "paper-tooltip" "PolymerElements/paper-tooltip#2.1.1" "PolymerElements/paper-tooltip#^2.1.1" "0ja9vz4xps7dxfx6kmrwq0gifbjsyc3pk9l3hd5233ss72ghlvgb")
8 (fetchbower "paper-toast" "PolymerElements/paper-toast#1.3.0" "PolymerElements/paper-toast#^1.3.0" "0x9rqxsks5455s8pk4aikpp99ijdn6kxr9gvhwh99nbcqdzcxq1m")
9 (fetchbower "paper-toast" "PolymerElements/paper-toast#2.1.2" "PolymerElements/paper-toast#^2.1.2" "0mkj9ayjx2l9hvrz4kw3yjbgrs9w873k05ywv94nh92mzpjkxn04")
9 (fetchbower "paper-toggle-button" "PolymerElements/paper-toggle-button#1.2.0" "PolymerElements/paper-toggle-button#^1.2.0" "0mphcng3ngspbpg4jjn0mb91nvr4xc1phq3qswib15h6sfww1b2w")
10 (fetchbower "paper-toggle-button" "PolymerElements/paper-toggle-button#2.1.1" "PolymerElements/paper-toggle-button#^2.1.1" "1rl5ar3ny6r3v9hr8s68v8b3zh5yl52pikhi4b9iv9grv29g5999")
10 (fetchbower "iron-ajax" "PolymerElements/iron-ajax#1.4.4" "PolymerElements/iron-ajax#^1.4.4" "0jpi7ik3zljw8yh2ccc85r26lcpzmkc2nl1kn6fqdx57zkzk9v5b")
11 (fetchbower "iron-ajax" "PolymerElements/iron-ajax#2.1.3" "PolymerElements/iron-ajax#^2.1.3" "187zb6lkv18yapl292qhn611mbl4i2bqs2dimlwmdjaln285nc1l")
11 (fetchbower "iron-autogrow-textarea" "PolymerElements/iron-autogrow-textarea#1.0.13" "PolymerElements/iron-autogrow-textarea#^1.0.13" "0zwhpl97vii1s8k0lgain8i9dnw29b0mxc5ixdscx9las13n2lqq")
12 (fetchbower "iron-autogrow-textarea" "PolymerElements/iron-autogrow-textarea#2.2.0" "PolymerElements/iron-autogrow-textarea#^2.2.0" "1cx7g49m20z08x25z24g2pvv6m6dwfbkga3nsw0rpi3jk7xhznqw")
12 (fetchbower "iron-a11y-keys" "PolymerElements/iron-a11y-keys#1.0.6" "PolymerElements/iron-a11y-keys#^1.0.6" "1xz3mgghfcxixq28sdb654iaxj4nyi1bzcwf77ydkms6fviqs9mv")
13 (fetchbower "iron-a11y-keys" "PolymerElements/iron-a11y-keys#2.1.2" "PolymerElements/iron-a11y-keys#^2.1.2" "0zdn3bzfrk88iwahmmzvcjn3m90zga1l8dx42b365n8if0n0zapj")
13 (fetchbower "iron-flex-layout" "PolymerElements/iron-flex-layout#1.3.1" "PolymerElements/iron-flex-layout#^1.0.0" "0nswv3ih3bhflgcd2wjfmddqswzgqxb2xbq65jk9w3rkj26hplbl")
14 (fetchbower "shadycss" "webcomponents/shadycss#1.3.5" "webcomponents/shadycss#^v1.1.0" "1xp07d6jlmc3ywg4cdp2nijwi0vrbzw468242xz0s6zx5z2n2wzf")
14 (fetchbower "paper-behaviors" "PolymerElements/paper-behaviors#1.0.12" "PolymerElements/paper-behaviors#^1.0.0" "012bqk97awgz55cn7rm9g7cckrdhkqhls3zvp8l6nd4rdwcrdzq8")
15 (fetchbower "iron-flex-layout" "PolymerElements/iron-flex-layout#2.0.3" "PolymerElements/iron-flex-layout#1 - 2" "1ir9ili3rkcgbfj6is5s70vyb7m6avz0av0lpjjlhhsplrrl90bk")
15 (fetchbower "paper-material" "PolymerElements/paper-material#1.0.6" "PolymerElements/paper-material#^1.0.0" "0rljmknfdbm5aabvx9pk77754zckj3l127c3mvnmwkpkkr353xnh")
16 (fetchbower "paper-behaviors" "PolymerElements/paper-behaviors#2.1.1" "PolymerElements/paper-behaviors#1 - 2" "0wzyznmy1q64jsm6lck0xma92lg2hz9h9m05r68iy20iyrvbjld7")
16 (fetchbower "paper-styles" "PolymerElements/paper-styles#1.1.4" "PolymerElements/paper-styles#^1.0.0" "0j8vg74xrcxlni8i93dsab3y80f34kk30lv4yblqpkp9c3nrilf7")
17 (fetchbower "paper-styles" "PolymerElements/paper-styles#2.1.0" "PolymerElements/paper-styles#1 - 2" "0xzsd7pvjsk7lgcmvx4q0dvps40q3mymkx26zgs8ns91s1ssfqbx")
17 (fetchbower "neon-animation" "PolymerElements/neon-animation#1.2.4" "PolymerElements/neon-animation#^1.0.0" "16mz9i2n5w0k5j8d6gha23cnbdgm5syz3fawyh89gdbq97bi2q5j")
18 (fetchbower "iron-a11y-announcer" "PolymerElements/iron-a11y-announcer#2.1.0" "PolymerElements/iron-a11y-announcer#1 - 2" "1hvmw76im8y3pxmg1yfnlkzap429q9i4v1z42y7m8lz0996jmxrz")
18 (fetchbower "iron-a11y-announcer" "PolymerElements/iron-a11y-announcer#1.0.5" "PolymerElements/iron-a11y-announcer#^1.0.0" "0n7c7j1pwk3835s7s2jd9125wdcsqf216yi5gj07wn5s8h8p7m9d")
19 (fetchbower "iron-overlay-behavior" "PolymerElements/iron-overlay-behavior#2.3.4" "PolymerElements/iron-overlay-behavior#1 - 2" "0hk2fxhfz7kg27349qz1c87vq6nfdcnjr9az3q95ak3rigsb71wg")
19 (fetchbower "iron-overlay-behavior" "PolymerElements/iron-overlay-behavior#1.8.6" "PolymerElements/iron-overlay-behavior#^1.0.9" "14brn9gz6qqskarg3fxk91xs7vg02vgcsz9a9743kidxr0l0413m")
20 (fetchbower "iron-fit-behavior" "PolymerElements/iron-fit-behavior#2.2.1" "PolymerElements/iron-fit-behavior#1 - 2" "0v89am4r2fncr7m9k0f2xqh5bvgn2dqjjc7p515ix4grk89whbs3")
20 (fetchbower "iron-fit-behavior" "PolymerElements/iron-fit-behavior#1.2.5" "PolymerElements/iron-fit-behavior#^1.1.0" "1msnlh8lp1xg6v4h6dkjwj9kzac5q5q208ayla3x9hi483ki6rlf")
21 (fetchbower "iron-checked-element-behavior" "PolymerElements/iron-checked-element-behavior#2.1.1" "PolymerElements/iron-checked-element-behavior#1 - 2" "00gpvnb7anspadw59av7lca6p03qlx59dgnhw3lqf5v223dsh0l3")
21 (fetchbower "iron-checked-element-behavior" "PolymerElements/iron-checked-element-behavior#1.0.5" "PolymerElements/iron-checked-element-behavior#^1.0.0" "0l0yy4ah454s8bzfv076s8by7h67zy9ni6xb932qwyhx8br6c1m7")
22 (fetchbower "iron-behaviors" "PolymerElements/iron-behaviors#2.1.1" "PolymerElements/iron-behaviors#1 - 2" "0c71l1il76jg8gvyh8bwlqraif53gfnz5700vpg35qyr1biwbr1w")
22 (fetchbower "promise-polyfill" "polymerlabs/promise-polyfill#1.0.1" "polymerlabs/promise-polyfill#^1.0.0" "045bj2caav3famr5hhxgs1dx7n08r4s46mlzwb313vdy17is38xb")
23 (fetchbower "iron-validatable-behavior" "PolymerElements/iron-validatable-behavior#2.1.0" "PolymerElements/iron-validatable-behavior#1 - 2" "1j65zv7hcxdcyyanzhp2wap3bnx7cz8ghd44m12fad2206jj6ysi")
23 (fetchbower "iron-behaviors" "PolymerElements/iron-behaviors#1.0.17" "PolymerElements/iron-behaviors#^1.0.0" "021qvkmbk32jrrmmphpmwgby4bzi5jyf47rh1bxmq2ip07ly4bpr")
24 (fetchbower "iron-a11y-keys-behavior" "PolymerElements/iron-a11y-keys-behavior#2.1.1" "PolymerElements/iron-a11y-keys-behavior#1 - 2" "0jsw7wvh4wzcjqdbvxyha99h1ph61lykyyyvdb6hm8m8w40bhs9b")
24 (fetchbower "iron-validatable-behavior" "PolymerElements/iron-validatable-behavior#1.1.1" "PolymerElements/iron-validatable-behavior#^1.0.0" "1yhxlvywhw2klbbgm3f3cmanxfxggagph4ii635zv0c13707wslv")
25 (fetchbower "paper-ripple" "PolymerElements/paper-ripple#2.1.1" "PolymerElements/paper-ripple#1 - 2" "0sam6w83nxf9mss79j6hjfsx0288pf4hwr1bw5xclzgpddcjmrm5")
25 (fetchbower "iron-form-element-behavior" "PolymerElements/iron-form-element-behavior#1.0.6" "PolymerElements/iron-form-element-behavior#^1.0.0" "0rdhxivgkdhhz2yadgdbjfc70l555p3y83vjh8rfj5hr0asyn6q1")
26 (fetchbower "font-roboto" "PolymerElements/font-roboto#1.1.0" "PolymerElements/font-roboto#^1.0.1" "0z4msvaa5pnr84j2r957g313fmdbdbrknhdw1axy5g48845yv04s")
26 (fetchbower "iron-a11y-keys-behavior" "polymerelements/iron-a11y-keys-behavior#1.1.9" "polymerelements/iron-a11y-keys-behavior#^1.0.0" "1imm4gc84qizihhbyhfa8lwjh3myhj837f79i5m04xjgwrjmkaf6")
27 (fetchbower "iron-resizable-behavior" "PolymerElements/iron-resizable-behavior#2.1.1" "PolymerElements/iron-resizable-behavior#1 - 2" "0169rg6kby0ypfiwbkin46ywaszwj7r91yn081yqd96l1115aqnk")
27 (fetchbower "paper-ripple" "PolymerElements/paper-ripple#1.0.8" "PolymerElements/paper-ripple#^1.0.0" "0r9sq8ik7wwrw0qb82c3rw0c030ljwd3s466c9y4qbcrsbvfjnns")
28 (fetchbower "iron-form-element-behavior" "PolymerElements/iron-form-element-behavior#2.1.3" "PolymerElements/iron-form-element-behavior#1 - 2" "1c83kkfqvb5pdlvrhad3l7b11i244a8lykc8kzfnb9ya0xrln0cn")
28 (fetchbower "font-roboto" "PolymerElements/font-roboto#1.0.1" "PolymerElements/font-roboto#^1.0.1" "02jz43r0wkyr3yp7rq2rc08l5cwnsgca9fr54sr4rhsnl7cjpxrj")
29 (fetchbower "iron-meta" "PolymerElements/iron-meta#2.1.1" "PolymerElements/iron-meta#1 - 2" "12w1pcl3w97xpxihqddbf2d9dx8xz5i1jd9bz1xrmfsh25isni40")
29 (fetchbower "iron-meta" "PolymerElements/iron-meta#1.1.2" "PolymerElements/iron-meta#^1.0.0" "1wl4dx8fnsknw9z9xi8bpc4cy9x70c11x4zxwxnj73hf3smifppl")
30 (fetchbower "iron-resizable-behavior" "PolymerElements/iron-resizable-behavior#1.0.5" "PolymerElements/iron-resizable-behavior#^1.0.0" "1fd5zmbr2hax42vmcasncvk7lzi38fmb1kyii26nn8pnnjak7zkn")
31 (fetchbower "iron-selector" "PolymerElements/iron-selector#1.5.2" "PolymerElements/iron-selector#^1.0.0" "1ajv46llqzvahm5g6g75w7nfyjcslp53ji0wm96l2k94j87spv3r")
32 (fetchbower "web-animations-js" "web-animations/web-animations-js#2.2.2" "web-animations/web-animations-js#^2.2.0" "1izfvm3l67vwys0bqbhidi9rqziw2f8wv289386sc6jsxzgkzhga")
33 ]; }
30 ]; }
@@ -1,12 +1,14 b''
1 # This file has been generated by node2nix 1.0.0. Do not edit!
1 # This file has been generated by node2nix 1.6.0. Do not edit!
2
2
3 {pkgs ? import <nixpkgs> {
3 {pkgs ? import <nixpkgs> {
4 inherit system;
4 inherit system;
5 }, system ? builtins.currentSystem}:
5 }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-6_x"}:
6
6
7 let
7 let
8 nodeEnv = import ./node-env.nix {
8 nodeEnv = import ./node-env.nix {
9 inherit (pkgs) stdenv python utillinux runCommand writeTextFile nodejs;
9 inherit (pkgs) stdenv python2 utillinux runCommand writeTextFile;
10 inherit nodejs;
11 libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null;
10 };
12 };
11 in
13 in
12 import ./node-packages.nix {
14 import ./node-packages.nix {
This diff has been collapsed as it changes many lines, (518 lines changed) Show them Hide them
@@ -1,31 +1,33 b''
1 # This file originates from node2nix
1 # This file originates from node2nix
2
2
3 {stdenv, python, nodejs, utillinux, runCommand, writeTextFile}:
3 {stdenv, nodejs, python2, utillinux, libtool, runCommand, writeTextFile}:
4
4
5 let
5 let
6 python = if nodejs ? python then nodejs.python else python2;
7
6 # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise
8 # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise
7 tarWrapper = runCommand "tarWrapper" {} ''
9 tarWrapper = runCommand "tarWrapper" {} ''
8 mkdir -p $out/bin
10 mkdir -p $out/bin
9
11
10 cat > $out/bin/tar <<EOF
12 cat > $out/bin/tar <<EOF
11 #! ${stdenv.shell} -e
13 #! ${stdenv.shell} -e
12 $(type -p tar) "\$@" --warning=no-unknown-keyword
14 $(type -p tar) "\$@" --warning=no-unknown-keyword
13 EOF
15 EOF
14
16
15 chmod +x $out/bin/tar
17 chmod +x $out/bin/tar
16 '';
18 '';
17
19
18 # Function that generates a TGZ file from a NPM project
20 # Function that generates a TGZ file from a NPM project
19 buildNodeSourceDist =
21 buildNodeSourceDist =
20 { name, version, src, ... }:
22 { name, version, src, ... }:
21
23
22 stdenv.mkDerivation {
24 stdenv.mkDerivation {
23 name = "node-tarball-${name}-${version}";
25 name = "node-tarball-${name}-${version}";
24 inherit src;
26 inherit src;
25 buildInputs = [ nodejs ];
27 buildInputs = [ nodejs ];
26 buildPhase = ''
28 buildPhase = ''
27 export HOME=$TMPDIR
29 export HOME=$TMPDIR
28 tgzFile=$(npm pack)
30 tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts)
29 '';
31 '';
30 installPhase = ''
32 installPhase = ''
31 mkdir -p $out/tarballs
33 mkdir -p $out/tarballs
@@ -42,151 +44,322 b' let'
42 # Bundle the dependencies of the package
44 # Bundle the dependencies of the package
43 mkdir -p node_modules
45 mkdir -p node_modules
44 cd node_modules
46 cd node_modules
45
47
46 # Only include dependencies if they don't exist. They may also be bundled in the package.
48 # Only include dependencies if they don't exist. They may also be bundled in the package.
47 if [ ! -e "${dependency.name}" ]
49 if [ ! -e "${dependency.name}" ]
48 then
50 then
49 ${composePackage dependency}
51 ${composePackage dependency}
50 fi
52 fi
51
53
52 cd ..
54 cd ..
53 ''
55 ''
54 ) dependencies);
56 ) dependencies);
55
57
56 # Recursively composes the dependencies of a package
58 # Recursively composes the dependencies of a package
57 composePackage = { name, packageName, src, dependencies ? [], ... }@args:
59 composePackage = { name, packageName, src, dependencies ? [], ... }@args:
58 let
59 fixImpureDependencies = writeTextFile {
60 name = "fixDependencies.js";
61 text = ''
62 var fs = require('fs');
63 var url = require('url');
64
65 /*
66 * Replaces an impure version specification by *
67 */
68 function replaceImpureVersionSpec(versionSpec) {
69 var parsedUrl = url.parse(versionSpec);
70
71 if(versionSpec == "latest" || versionSpec == "unstable" ||
72 versionSpec.substr(0, 2) == ".." || dependency.substr(0, 2) == "./" || dependency.substr(0, 2) == "~/" || dependency.substr(0, 1) == '/')
73 return '*';
74 else if(parsedUrl.protocol == "git:" || parsedUrl.protocol == "git+ssh:" || parsedUrl.protocol == "git+http:" || parsedUrl.protocol == "git+https:" ||
75 parsedUrl.protocol == "http:" || parsedUrl.protocol == "https:")
76 return '*';
77 else
78 return versionSpec;
79 }
80
81 var packageObj = JSON.parse(fs.readFileSync('./package.json'));
82
83 /* Replace dependencies */
84 if(packageObj.dependencies !== undefined) {
85 for(var dependency in packageObj.dependencies) {
86 var versionSpec = packageObj.dependencies[dependency];
87 packageObj.dependencies[dependency] = replaceImpureVersionSpec(versionSpec);
88 }
89 }
90
91 /* Replace development dependencies */
92 if(packageObj.devDependencies !== undefined) {
93 for(var dependency in packageObj.devDependencies) {
94 var versionSpec = packageObj.devDependencies[dependency];
95 packageObj.devDependencies[dependency] = replaceImpureVersionSpec(versionSpec);
96 }
97 }
98
99 /* Replace optional dependencies */
100 if(packageObj.optionalDependencies !== undefined) {
101 for(var dependency in packageObj.optionalDependencies) {
102 var versionSpec = packageObj.optionalDependencies[dependency];
103 packageObj.optionalDependencies[dependency] = replaceImpureVersionSpec(versionSpec);
104 }
105 }
106
107 /* Write the fixed JSON file */
108 fs.writeFileSync("package.json", JSON.stringify(packageObj));
109 '';
110 };
111 in
112 ''
60 ''
113 DIR=$(pwd)
61 DIR=$(pwd)
114 cd $TMPDIR
62 cd $TMPDIR
115
63
116 unpackFile ${src}
64 unpackFile ${src}
117
65
118 # Make the base dir in which the target dependency resides first
66 # Make the base dir in which the target dependency resides first
119 mkdir -p "$(dirname "$DIR/${packageName}")"
67 mkdir -p "$(dirname "$DIR/${packageName}")"
120
68
121 if [ -f "${src}" ]
69 if [ -f "${src}" ]
122 then
70 then
123 # Figure out what directory has been unpacked
71 # Figure out what directory has been unpacked
124 packageDir=$(find . -type d -maxdepth 1 | tail -1)
72 packageDir="$(find . -maxdepth 1 -type d | tail -1)"
125
73
126 # Restore write permissions to make building work
74 # Restore write permissions to make building work
75 find "$packageDir" -type d -print0 | xargs -0 chmod u+x
127 chmod -R u+w "$packageDir"
76 chmod -R u+w "$packageDir"
128
77
129 # Move the extracted tarball into the output folder
78 # Move the extracted tarball into the output folder
130 mv "$packageDir" "$DIR/${packageName}"
79 mv "$packageDir" "$DIR/${packageName}"
131 elif [ -d "${src}" ]
80 elif [ -d "${src}" ]
132 then
81 then
82 # Get a stripped name (without hash) of the source directory.
83 # On old nixpkgs it's already set internally.
84 if [ -z "$strippedName" ]
85 then
86 strippedName="$(stripHash ${src})"
87 fi
88
133 # Restore write permissions to make building work
89 # Restore write permissions to make building work
134 chmod -R u+w $strippedName
90 chmod -R u+w "$strippedName"
135
91
136 # Move the extracted directory into the output folder
92 # Move the extracted directory into the output folder
137 mv $strippedName "$DIR/${packageName}"
93 mv "$strippedName" "$DIR/${packageName}"
138 fi
94 fi
139
95
140 # Unset the stripped name to not confuse the next unpack step
96 # Unset the stripped name to not confuse the next unpack step
141 unset strippedName
97 unset strippedName
142
98
143 # Some version specifiers (latest, unstable, URLs, file paths) force NPM to make remote connections or consult paths outside the Nix store.
99 # Include the dependencies of the package
144 # The following JavaScript replaces these by * to prevent that
145 cd "$DIR/${packageName}"
100 cd "$DIR/${packageName}"
146 node ${fixImpureDependencies}
147
148 # Include the dependencies of the package
149 ${includeDependencies { inherit dependencies; }}
101 ${includeDependencies { inherit dependencies; }}
150 cd ..
102 cd ..
151 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
103 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
152 '';
104 '';
153
105
106 pinpointDependencies = {dependencies, production}:
107 let
108 pinpointDependenciesFromPackageJSON = writeTextFile {
109 name = "pinpointDependencies.js";
110 text = ''
111 var fs = require('fs');
112 var path = require('path');
113
114 function resolveDependencyVersion(location, name) {
115 if(location == process.env['NIX_STORE']) {
116 return null;
117 } else {
118 var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json");
119
120 if(fs.existsSync(dependencyPackageJSON)) {
121 var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON));
122
123 if(dependencyPackageObj.name == name) {
124 return dependencyPackageObj.version;
125 }
126 } else {
127 return resolveDependencyVersion(path.resolve(location, ".."), name);
128 }
129 }
130 }
131
132 function replaceDependencies(dependencies) {
133 if(typeof dependencies == "object" && dependencies !== null) {
134 for(var dependency in dependencies) {
135 var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency);
136
137 if(resolvedVersion === null) {
138 process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n");
139 } else {
140 dependencies[dependency] = resolvedVersion;
141 }
142 }
143 }
144 }
145
146 /* Read the package.json configuration */
147 var packageObj = JSON.parse(fs.readFileSync('./package.json'));
148
149 /* Pinpoint all dependencies */
150 replaceDependencies(packageObj.dependencies);
151 if(process.argv[2] == "development") {
152 replaceDependencies(packageObj.devDependencies);
153 }
154 replaceDependencies(packageObj.optionalDependencies);
155
156 /* Write the fixed package.json file */
157 fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2));
158 '';
159 };
160 in
161 ''
162 node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
163
164 ${stdenv.lib.optionalString (dependencies != [])
165 ''
166 if [ -d node_modules ]
167 then
168 cd node_modules
169 ${stdenv.lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
170 cd ..
171 fi
172 ''}
173 '';
174
175 # Recursively traverses all dependencies of a package and pinpoints all
176 # dependencies in the package.json file to the versions that are actually
177 # being used.
178
179 pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args:
180 ''
181 if [ -d "${packageName}" ]
182 then
183 cd "${packageName}"
184 ${pinpointDependencies { inherit dependencies production; }}
185 cd ..
186 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
187 fi
188 '';
189
154 # Extract the Node.js source code which is used to compile packages with
190 # Extract the Node.js source code which is used to compile packages with
155 # native bindings
191 # native bindings
156 nodeSources = runCommand "node-sources" {} ''
192 nodeSources = runCommand "node-sources" {} ''
157 tar --no-same-owner --no-same-permissions -xf ${nodejs.src}
193 tar --no-same-owner --no-same-permissions -xf ${nodejs.src}
158 mv node-* $out
194 mv node-* $out
159 '';
195 '';
160
196
197 # Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty)
198 addIntegrityFieldsScript = writeTextFile {
199 name = "addintegrityfields.js";
200 text = ''
201 var fs = require('fs');
202 var path = require('path');
203
204 function augmentDependencies(baseDir, dependencies) {
205 for(var dependencyName in dependencies) {
206 var dependency = dependencies[dependencyName];
207
208 // Open package.json and augment metadata fields
209 var packageJSONDir = path.join(baseDir, "node_modules", dependencyName);
210 var packageJSONPath = path.join(packageJSONDir, "package.json");
211
212 if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored
213 console.log("Adding metadata fields to: "+packageJSONPath);
214 var packageObj = JSON.parse(fs.readFileSync(packageJSONPath));
215
216 if(dependency.integrity) {
217 packageObj["_integrity"] = dependency.integrity;
218 } else {
219 packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads.
220 }
221
222 packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories.
223 fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2));
224 }
225
226 // Augment transitive dependencies
227 if(dependency.dependencies !== undefined) {
228 augmentDependencies(packageJSONDir, dependency.dependencies);
229 }
230 }
231 }
232
233 if(fs.existsSync("./package-lock.json")) {
234 var packageLock = JSON.parse(fs.readFileSync("./package-lock.json"));
235
236 if(packageLock.lockfileVersion !== 1) {
237 process.stderr.write("Sorry, I only understand lock file version 1!\n");
238 process.exit(1);
239 }
240
241 if(packageLock.dependencies !== undefined) {
242 augmentDependencies(".", packageLock.dependencies);
243 }
244 }
245 '';
246 };
247
248 # Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes
249 reconstructPackageLock = writeTextFile {
250 name = "addintegrityfields.js";
251 text = ''
252 var fs = require('fs');
253 var path = require('path');
254
255 var packageObj = JSON.parse(fs.readFileSync("package.json"));
256
257 var lockObj = {
258 name: packageObj.name,
259 version: packageObj.version,
260 lockfileVersion: 1,
261 requires: true,
262 dependencies: {}
263 };
264
265 function augmentPackageJSON(filePath, dependencies) {
266 var packageJSON = path.join(filePath, "package.json");
267 if(fs.existsSync(packageJSON)) {
268 var packageObj = JSON.parse(fs.readFileSync(packageJSON));
269 dependencies[packageObj.name] = {
270 version: packageObj.version,
271 integrity: "sha1-000000000000000000000000000=",
272 dependencies: {}
273 };
274 processDependencies(path.join(filePath, "node_modules"), dependencies[packageObj.name].dependencies);
275 }
276 }
277
278 function processDependencies(dir, dependencies) {
279 if(fs.existsSync(dir)) {
280 var files = fs.readdirSync(dir);
281
282 files.forEach(function(entry) {
283 var filePath = path.join(dir, entry);
284 var stats = fs.statSync(filePath);
285
286 if(stats.isDirectory()) {
287 if(entry.substr(0, 1) == "@") {
288 // When we encounter a namespace folder, augment all packages belonging to the scope
289 var pkgFiles = fs.readdirSync(filePath);
290
291 pkgFiles.forEach(function(entry) {
292 if(stats.isDirectory()) {
293 var pkgFilePath = path.join(filePath, entry);
294 augmentPackageJSON(pkgFilePath, dependencies);
295 }
296 });
297 } else {
298 augmentPackageJSON(filePath, dependencies);
299 }
300 }
301 });
302 }
303 }
304
305 processDependencies("node_modules", lockObj.dependencies);
306
307 fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2));
308 '';
309 };
310
161 # Builds and composes an NPM package including all its dependencies
311 # Builds and composes an NPM package including all its dependencies
162 buildNodePackage = { name, packageName, version, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, preRebuild ? "", ... }@args:
312 buildNodePackage =
163
313 { name
164 stdenv.lib.makeOverridable stdenv.mkDerivation (builtins.removeAttrs args [ "dependencies" ] // {
314 , packageName
315 , version
316 , dependencies ? []
317 , buildInputs ? []
318 , production ? true
319 , npmFlags ? ""
320 , dontNpmInstall ? false
321 , bypassCache ? false
322 , preRebuild ? ""
323 , dontStrip ? true
324 , unpackPhase ? "true"
325 , buildPhase ? "true"
326 , ... }@args:
327
328 let
329 forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
330 extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" ];
331 in
332 stdenv.mkDerivation ({
165 name = "node-${name}-${version}";
333 name = "node-${name}-${version}";
166 buildInputs = [ tarWrapper python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or [];
334 buildInputs = [ tarWrapper python nodejs ]
167 dontStrip = args.dontStrip or true; # Striping may fail a build for some package deployments
335 ++ stdenv.lib.optional (stdenv.isLinux) utillinux
168
336 ++ stdenv.lib.optional (stdenv.isDarwin) libtool
169 inherit dontNpmInstall preRebuild;
337 ++ buildInputs;
170
338
171 unpackPhase = args.unpackPhase or "true";
339 inherit dontStrip; # Stripping may fail a build for some package deployments
172
340 inherit dontNpmInstall preRebuild unpackPhase buildPhase;
173 buildPhase = args.buildPhase or "true";
341
174
175 compositionScript = composePackage args;
342 compositionScript = composePackage args;
176 passAsFile = [ "compositionScript" ];
343 pinpointDependenciesScript = pinpointDependenciesOfPackage args;
177
344
178 installPhase = args.installPhase or ''
345 passAsFile = [ "compositionScript" "pinpointDependenciesScript" ];
346
347 installPhase = ''
179 # Create and enter a root node_modules/ folder
348 # Create and enter a root node_modules/ folder
180 mkdir -p $out/lib/node_modules
349 mkdir -p $out/lib/node_modules
181 cd $out/lib/node_modules
350 cd $out/lib/node_modules
182
351
183 # Compose the package and all its dependencies
352 # Compose the package and all its dependencies
184 source $compositionScriptPath
353 source $compositionScriptPath
185
354
355 # Pinpoint the versions of all dependencies to the ones that are actually being used
356 echo "pinpointing versions of dependencies..."
357 source $pinpointDependenciesScriptPath
358
186 # Patch the shebangs of the bundled modules to prevent them from
359 # Patch the shebangs of the bundled modules to prevent them from
187 # calling executables outside the Nix store as much as possible
360 # calling executables outside the Nix store as much as possible
188 patchShebangs .
361 patchShebangs .
189
362
190 # Deploy the Node.js package by running npm install. Since the
363 # Deploy the Node.js package by running npm install. Since the
191 # dependencies have been provided already by ourselves, it should not
364 # dependencies have been provided already by ourselves, it should not
192 # attempt to install them again, which is good, because we want to make
365 # attempt to install them again, which is good, because we want to make
@@ -196,23 +369,37 b' let'
196 #
369 #
197 # The other responsibilities of NPM are kept -- version checks, build
370 # The other responsibilities of NPM are kept -- version checks, build
198 # steps, postprocessing etc.
371 # steps, postprocessing etc.
199
372
200 export HOME=$TMPDIR
373 export HOME=$TMPDIR
201 cd "${packageName}"
374 cd "${packageName}"
202 runHook preRebuild
375 runHook preRebuild
203 npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
376
204
377 ${stdenv.lib.optionalString bypassCache ''
378 if [ ! -f package-lock.json ]
379 then
380 echo "No package-lock.json file found, reconstructing..."
381 node ${reconstructPackageLock}
382 fi
383
384 node ${addIntegrityFieldsScript}
385 ''}
386
387 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
388
205 if [ "$dontNpmInstall" != "1" ]
389 if [ "$dontNpmInstall" != "1" ]
206 then
390 then
207 npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
391 # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
392 rm -f npm-shrinkwrap.json
393
394 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
208 fi
395 fi
209
396
210 # Create symlink to the deployed executable folder, if applicable
397 # Create symlink to the deployed executable folder, if applicable
211 if [ -d "$out/lib/node_modules/.bin" ]
398 if [ -d "$out/lib/node_modules/.bin" ]
212 then
399 then
213 ln -s $out/lib/node_modules/.bin $out/bin
400 ln -s $out/lib/node_modules/.bin $out/bin
214 fi
401 fi
215
402
216 # Create symlinks to the deployed manual page folders, if applicable
403 # Create symlinks to the deployed manual page folders, if applicable
217 if [ -d "$out/lib/node_modules/${packageName}/man" ]
404 if [ -d "$out/lib/node_modules/${packageName}/man" ]
218 then
405 then
@@ -226,52 +413,111 b' let'
226 done
413 done
227 done
414 done
228 fi
415 fi
416
417 # Run post install hook, if provided
418 runHook postInstall
229 '';
419 '';
230 });
420 } // extraArgs);
231
421
232 # Builds a development shell
422 # Builds a development shell
233 buildNodeShell = { name, packageName, version, src, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, ... }@args:
423 buildNodeShell =
424 { name
425 , packageName
426 , version
427 , src
428 , dependencies ? []
429 , buildInputs ? []
430 , production ? true
431 , npmFlags ? ""
432 , dontNpmInstall ? false
433 , bypassCache ? false
434 , dontStrip ? true
435 , unpackPhase ? "true"
436 , buildPhase ? "true"
437 , ... }@args:
438
234 let
439 let
235 nodeDependencies = stdenv.mkDerivation {
440 forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
441
442 extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ];
443
444 nodeDependencies = stdenv.mkDerivation ({
236 name = "node-dependencies-${name}-${version}";
445 name = "node-dependencies-${name}-${version}";
237
446
238 buildInputs = [ tarWrapper python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or [];
447 buildInputs = [ tarWrapper python nodejs ]
239
448 ++ stdenv.lib.optional (stdenv.isLinux) utillinux
449 ++ stdenv.lib.optional (stdenv.isDarwin) libtool
450 ++ buildInputs;
451
452 inherit dontStrip; # Stripping may fail a build for some package deployments
453 inherit dontNpmInstall unpackPhase buildPhase;
454
240 includeScript = includeDependencies { inherit dependencies; };
455 includeScript = includeDependencies { inherit dependencies; };
241 passAsFile = [ "includeScript" ];
456 pinpointDependenciesScript = pinpointDependenciesOfPackage args;
242
457
243 buildCommand = ''
458 passAsFile = [ "includeScript" "pinpointDependenciesScript" ];
244 mkdir -p $out/lib
459
245 cd $out/lib
460 installPhase = ''
461 mkdir -p $out/${packageName}
462 cd $out/${packageName}
463
246 source $includeScriptPath
464 source $includeScriptPath
247
465
248 # Create fake package.json to make the npm commands work properly
466 # Create fake package.json to make the npm commands work properly
249 cat > package.json <<EOF
467 cp ${src}/package.json .
250 {
468 chmod 644 package.json
251 "name": "${packageName}",
469 ${stdenv.lib.optionalString bypassCache ''
252 "version": "${version}"
470 if [ -f ${src}/package-lock.json ]
253 }
471 then
254 EOF
472 cp ${src}/package-lock.json .
255
473 fi
474 ''}
475
476 # Pinpoint the versions of all dependencies to the ones that are actually being used
477 echo "pinpointing versions of dependencies..."
478 cd ..
479 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
480
481 source $pinpointDependenciesScriptPath
482 cd ${packageName}
483
256 # Patch the shebangs of the bundled modules to prevent them from
484 # Patch the shebangs of the bundled modules to prevent them from
257 # calling executables outside the Nix store as much as possible
485 # calling executables outside the Nix store as much as possible
258 patchShebangs .
486 patchShebangs .
259
487
260 export HOME=$TMPDIR
488 export HOME=$PWD
261 npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
489
262
490 ${stdenv.lib.optionalString bypassCache ''
263 ${stdenv.lib.optionalString (!dontNpmInstall) ''
491 if [ ! -f package-lock.json ]
264 npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
492 then
493 echo "No package-lock.json file found, reconstructing..."
494 node ${reconstructPackageLock}
495 fi
496
497 node ${addIntegrityFieldsScript}
265 ''}
498 ''}
266
499
500 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
501
502 ${stdenv.lib.optionalString (!dontNpmInstall) ''
503 # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
504 rm -f npm-shrinkwrap.json
505
506 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
507 ''}
508
509 cd ..
510 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
511
512 mv ${packageName} lib
267 ln -s $out/lib/node_modules/.bin $out/bin
513 ln -s $out/lib/node_modules/.bin $out/bin
268 '';
514 '';
269 };
515 } // extraArgs);
270 in
516 in
271 stdenv.lib.makeOverridable stdenv.mkDerivation {
517 stdenv.mkDerivation {
272 name = "node-shell-${name}-${version}";
518 name = "node-shell-${name}-${version}";
273
519
274 buildInputs = [ python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or [];
520 buildInputs = [ python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
275 buildCommand = ''
521 buildCommand = ''
276 mkdir -p $out/bin
522 mkdir -p $out/bin
277 cat > $out/bin/shell <<EOF
523 cat > $out/bin/shell <<EOF
@@ -281,7 +527,7 b' let'
281 EOF
527 EOF
282 chmod +x $out/bin/shell
528 chmod +x $out/bin/shell
283 '';
529 '';
284
530
285 # Provide the dependencies in a development shell through the NODE_PATH environment variable
531 # Provide the dependencies in a development shell through the NODE_PATH environment variable
286 inherit nodeDependencies;
532 inherit nodeDependencies;
287 shellHook = stdenv.lib.optionalString (dependencies != []) ''
533 shellHook = stdenv.lib.optionalString (dependencies != []) ''
@@ -289,4 +535,8 b' let'
289 '';
535 '';
290 };
536 };
291 in
537 in
292 { inherit buildNodeSourceDist buildNodePackage buildNodeShell; }
538 {
539 buildNodeSourceDist = stdenv.lib.makeOverridable buildNodeSourceDist;
540 buildNodePackage = stdenv.lib.makeOverridable buildNodePackage;
541 buildNodeShell = stdenv.lib.makeOverridable buildNodeShell;
542 }
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from pkgs/patch-beaker-lock-func-debug.diff to pkgs/patch_beaker/patch-beaker-lock-func-debug.diff
NO CONTENT: file renamed from pkgs/patch-beaker-lock-func-debug.diff to pkgs/patch_beaker/patch-beaker-lock-func-debug.diff
@@ -4,10 +4,13 b''
4 # python-packages.nix. The main objective is to add needed dependencies of C
4 # python-packages.nix. The main objective is to add needed dependencies of C
5 # libraries and tweak the build instructions where needed.
5 # libraries and tweak the build instructions where needed.
6
6
7 { pkgs, basePythonPackages }:
7 { pkgs
8 , basePythonPackages
9 }:
8
10
9 let
11 let
10 sed = "sed -i";
12 sed = "sed -i";
13
11 localLicenses = {
14 localLicenses = {
12 repoze = {
15 repoze = {
13 fullName = "Repoze License";
16 fullName = "Repoze License";
@@ -19,32 +22,41 b' in'
19
22
20 self: super: {
23 self: super: {
21
24
22 appenlight-client = super.appenlight-client.override (attrs: {
25 "appenlight-client" = super."appenlight-client".override (attrs: {
23 meta = {
26 meta = {
24 license = [ pkgs.lib.licenses.bsdOriginal ];
27 license = [ pkgs.lib.licenses.bsdOriginal ];
25 };
28 };
26 });
29 });
27
30
28 Beaker = super.Beaker.override (attrs: {
31 "beaker" = super."beaker".override (attrs: {
29 patches = [
32 patches = [
30 ./patch-beaker-lock-func-debug.diff
33 ./patch_beaker/patch-beaker-lock-func-debug.diff
34 ./patch_beaker/patch-beaker-metadata-reuse.diff
31 ];
35 ];
32 });
36 });
33
37
34 future = super.future.override (attrs: {
38 "gevent" = super."gevent".override (attrs: {
39 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
40 # NOTE: (marcink) odd requirements from gevent aren't set properly,
41 # thus we need to inject psutil manually
42 self."psutil"
43 ];
44 });
45
46 "future" = super."future".override (attrs: {
35 meta = {
47 meta = {
36 license = [ pkgs.lib.licenses.mit ];
48 license = [ pkgs.lib.licenses.mit ];
37 };
49 };
38 });
50 });
39
51
40 testpath = super.testpath.override (attrs: {
52 "testpath" = super."testpath".override (attrs: {
41 meta = {
53 meta = {
42 license = [ pkgs.lib.licenses.mit ];
54 license = [ pkgs.lib.licenses.mit ];
43 };
55 };
44 });
56 });
45
57
46 gnureadline = super.gnureadline.override (attrs: {
58 "gnureadline" = super."gnureadline".override (attrs: {
47 buildInputs = attrs.buildInputs ++ [
59 buildInputs = [
48 pkgs.ncurses
60 pkgs.ncurses
49 ];
61 ];
50 patchPhase = ''
62 patchPhase = ''
@@ -52,56 +64,50 b' self: super: {'
52 '';
64 '';
53 });
65 });
54
66
55 gunicorn = super.gunicorn.override (attrs: {
67 "gunicorn" = super."gunicorn".override (attrs: {
56 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
68 propagatedBuildInputs = [
57 # johbo: futures is needed as long as we are on Python 2, otherwise
69 # johbo: futures is needed as long as we are on Python 2, otherwise
58 # gunicorn explodes if used with multiple threads per worker.
70 # gunicorn explodes if used with multiple threads per worker.
59 self.futures
71 self."futures"
60 ];
72 ];
61 });
73 });
62
74
63 nbconvert = super.nbconvert.override (attrs: {
75 "nbconvert" = super."nbconvert".override (attrs: {
64 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
76 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
65 # marcink: plug in jupyter-client for notebook rendering
77 # marcink: plug in jupyter-client for notebook rendering
66 self.jupyter-client
78 self."jupyter-client"
67 ];
79 ];
68 });
80 });
69
81
70 ipython = super.ipython.override (attrs: {
82 "ipython" = super."ipython".override (attrs: {
71 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
83 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
72 self.gnureadline
84 self."gnureadline"
73 ];
85 ];
74 });
86 });
75
87
76 lxml = super.lxml.override (attrs: {
88 "lxml" = super."lxml".override (attrs: {
77 # johbo: On 16.09 we need this to compile on darwin, otherwise compilation
89 buildInputs = [
78 # fails on Darwin.
79 hardeningDisable = if pkgs.stdenv.isDarwin then [ "format" ] else null;
80 buildInputs = with self; [
81 pkgs.libxml2
90 pkgs.libxml2
82 pkgs.libxslt
91 pkgs.libxslt
83 ];
92 ];
93 propagatedBuildInputs = [
94 # Needed, so that "setup.py bdist_wheel" does work
95 self."wheel"
96 ];
84 });
97 });
85
98
86 MySQL-python = super.MySQL-python.override (attrs: {
99 "mysql-python" = super."mysql-python".override (attrs: {
87 buildInputs = attrs.buildInputs ++ [
100 buildInputs = [
88 pkgs.openssl
101 pkgs.openssl
89 ];
102 ];
90 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
103 propagatedBuildInputs = [
91 pkgs.libmysql
104 pkgs.libmysql
92 pkgs.zlib
105 pkgs.zlib
93 ];
106 ];
94 });
107 });
95
108
96 psutil = super.psutil.override (attrs: {
109 "psycopg2" = super."psycopg2".override (attrs: {
97 buildInputs = attrs.buildInputs ++
110 propagatedBuildInputs = [
98 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.IOKit;
99 });
100
101 psycopg2 = super.psycopg2.override (attrs: {
102 buildInputs = attrs.buildInputs ++
103 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.openssl;
104 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
105 pkgs.postgresql
111 pkgs.postgresql
106 ];
112 ];
107 meta = {
113 meta = {
@@ -109,8 +115,8 b' self: super: {'
109 };
115 };
110 });
116 });
111
117
112 pycurl = super.pycurl.override (attrs: {
118 "pycurl" = super."pycurl".override (attrs: {
113 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
119 propagatedBuildInputs = [
114 pkgs.curl
120 pkgs.curl
115 pkgs.openssl
121 pkgs.openssl
116 ];
122 ];
@@ -119,30 +125,23 b' self: super: {'
119 export PYCURL_SSL_LIBRARY=openssl
125 export PYCURL_SSL_LIBRARY=openssl
120 '';
126 '';
121 meta = {
127 meta = {
122 # TODO: It is LGPL and MIT
123 license = pkgs.lib.licenses.mit;
128 license = pkgs.lib.licenses.mit;
124 };
129 };
125 });
130 });
126
131
127 pyramid = super.pyramid.override (attrs: {
132 "pyramid" = super."pyramid".override (attrs: {
128 postFixup = ''
129 wrapPythonPrograms
130 # TODO: johbo: "wrapPython" adds this magic line which
131 # confuses pserve.
132 ${sed} '/import sys; sys.argv/d' $out/bin/.pserve-wrapped
133 '';
134 meta = {
133 meta = {
135 license = localLicenses.repoze;
134 license = localLicenses.repoze;
136 };
135 };
137 });
136 });
138
137
139 pyramid-debugtoolbar = super.pyramid-debugtoolbar.override (attrs: {
138 "pyramid-debugtoolbar" = super."pyramid-debugtoolbar".override (attrs: {
140 meta = {
139 meta = {
141 license = [ pkgs.lib.licenses.bsdOriginal localLicenses.repoze ];
140 license = [ pkgs.lib.licenses.bsdOriginal localLicenses.repoze ];
142 };
141 };
143 });
142 });
144
143
145 pysqlite = super.pysqlite.override (attrs: {
144 "pysqlite" = super."pysqlite".override (attrs: {
146 propagatedBuildInputs = [
145 propagatedBuildInputs = [
147 pkgs.sqlite
146 pkgs.sqlite
148 ];
147 ];
@@ -151,41 +150,39 b' self: super: {'
151 };
150 };
152 });
151 });
153
152
154 pytest-runner = super.pytest-runner.override (attrs: {
153 "pytest-runner" = super."pytest-runner".override (attrs: {
155 propagatedBuildInputs = [
154 propagatedBuildInputs = [
156 self.setuptools-scm
155 self."setuptools-scm"
156 ];
157 });
158
159 "python-ldap" = super."python-ldap".override (attrs: {
160 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
161 pkgs.openldap
162 pkgs.cyrus_sasl
163 pkgs.openssl
157 ];
164 ];
158 });
165 });
159
166
160 python-ldap = super.python-ldap.override (attrs: {
167 "python-pam" = super."python-pam".override (attrs: {
161 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
168 propagatedBuildInputs = [
162 pkgs.cyrus_sasl
169 pkgs.pam
163 pkgs.openldap
164 pkgs.openssl
165 ];
170 ];
166 # TODO: johbo: Remove the "or" once we drop 16.03 support.
171 # TODO: johbo: Check if this can be avoided, or transform into
167 NIX_CFLAGS_COMPILE = "-I${pkgs.cyrus_sasl.dev or pkgs.cyrus_sasl}/include/sasl";
172 # a real patch
173 patchPhase = ''
174 substituteInPlace pam.py \
175 --replace 'find_library("pam")' '"${pkgs.pam}/lib/libpam.so.0"'
176 '';
177 });
178
179 "pyzmq" = super."pyzmq".override (attrs: {
180 buildInputs = [
181 pkgs.czmq
182 ];
168 });
183 });
169
184
170 python-pam = super.python-pam.override (attrs:
185 "urlobject" = super."urlobject".override (attrs: {
171 let
172 includeLibPam = pkgs.stdenv.isLinux;
173 in {
174 # TODO: johbo: Move the option up into the default.nix, we should
175 # include python-pam only on supported platforms.
176 propagatedBuildInputs = attrs.propagatedBuildInputs ++
177 pkgs.lib.optional includeLibPam [
178 pkgs.pam
179 ];
180 # TODO: johbo: Check if this can be avoided, or transform into
181 # a real patch
182 patchPhase = pkgs.lib.optionals includeLibPam ''
183 substituteInPlace pam.py \
184 --replace 'find_library("pam")' '"${pkgs.pam}/lib/libpam.so.0"'
185 '';
186 });
187
188 URLObject = super.URLObject.override (attrs: {
189 meta = {
186 meta = {
190 license = {
187 license = {
191 spdxId = "Unlicense";
188 spdxId = "Unlicense";
@@ -195,56 +192,56 b' self: super: {'
195 };
192 };
196 });
193 });
197
194
198 docutils = super.docutils.override (attrs: {
195 "docutils" = super."docutils".override (attrs: {
199 meta = {
196 meta = {
200 license = pkgs.lib.licenses.bsd2;
197 license = pkgs.lib.licenses.bsd2;
201 };
198 };
202 });
199 });
203
200
204 colander = super.colander.override (attrs: {
201 "colander" = super."colander".override (attrs: {
205 meta = {
202 meta = {
206 license = localLicenses.repoze;
203 license = localLicenses.repoze;
207 };
204 };
208 });
205 });
209
206
210 pyramid-beaker = super.pyramid-beaker.override (attrs: {
207 "pyramid-beaker" = super."pyramid-beaker".override (attrs: {
211 meta = {
208 meta = {
212 license = localLicenses.repoze;
209 license = localLicenses.repoze;
213 };
210 };
214 });
211 });
215
212
216 pyramid-mako = super.pyramid-mako.override (attrs: {
213 "pyramid-mako" = super."pyramid-mako".override (attrs: {
217 meta = {
214 meta = {
218 license = localLicenses.repoze;
215 license = localLicenses.repoze;
219 };
216 };
220 });
217 });
221
218
222 repoze.lru = super.repoze.lru.override (attrs: {
219 "repoze.lru" = super."repoze.lru".override (attrs: {
223 meta = {
220 meta = {
224 license = localLicenses.repoze;
221 license = localLicenses.repoze;
225 };
222 };
226 });
223 });
227
224
228 python-editor = super.python-editor.override (attrs: {
225 "python-editor" = super."python-editor".override (attrs: {
229 meta = {
226 meta = {
230 license = pkgs.lib.licenses.asl20;
227 license = pkgs.lib.licenses.asl20;
231 };
228 };
232 });
229 });
233
230
234 translationstring = super.translationstring.override (attrs: {
231 "translationstring" = super."translationstring".override (attrs: {
235 meta = {
232 meta = {
236 license = localLicenses.repoze;
233 license = localLicenses.repoze;
237 };
234 };
238 });
235 });
239
236
240 venusian = super.venusian.override (attrs: {
237 "venusian" = super."venusian".override (attrs: {
241 meta = {
238 meta = {
242 license = localLicenses.repoze;
239 license = localLicenses.repoze;
243 };
240 };
244 });
241 });
245
242
246 # Avoid that setuptools is replaced, this leads to trouble
243 # Avoid that base packages screw up the build process
247 # with buildPythonPackage.
244 inherit (basePythonPackages)
248 setuptools = basePythonPackages.setuptools;
245 setuptools;
249
246
250 }
247 }
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,6 +1,7 b''
1 [pytest]
1 [pytest]
2 testpaths = rhodecode
2 testpaths = rhodecode
3 norecursedirs = rhodecode/public rhodecode/templates tests/scripts
3 norecursedirs = rhodecode/public rhodecode/templates tests/scripts
4 cache_dir = /tmp/.pytest_cache
4
5
5 pyramid_config = rhodecode/tests/rhodecode.ini
6 pyramid_config = rhodecode/tests/rhodecode.ini
6 vcsserver_protocol = http
7 vcsserver_protocol = http
@@ -1,232 +1,21 b''
1 #
1 # This file defines how to "build" for packaging.
2 # About
3 # =====
4 #
5 # This file defines jobs for our CI system and the attribute "build" is used
6 # as the input for packaging.
7 #
8 #
9 # CI details
10 # ==========
11 #
12 # This file defines an attribute set of derivations. Each of these attributes is
13 # then used in our CI system as one job to run. This way we keep the
14 # configuration for the CI jobs as well under version control.
15 #
16 # Run CI jobs locally
17 # -------------------
18 #
19 # Since it is all based on normal Nix derivations, the jobs can be tested
20 # locally with a run of "nix-build" like the following example:
21 #
22 # nix-build release.nix -A test-api -I vcsserver=~/rhodecode-vcsserver
23 #
24 # Note: Replace "~/rhodecode-vcsserver" with a path where a clone of the
25 # vcsserver resides.
26
2
27 { pkgs ? import <nixpkgs> {}
3 { pkgs ? import <nixpkgs> {}
28 , doCheck ? true
4 , doCheck ? false
29 }:
5 }:
30
6
31 let
7 let
32
8 enterprise_ce = import ./default.nix {
33 inherit (pkgs)
34 stdenv
35 system;
36
37 testing = import <nixpkgs/nixos/lib/testing.nix> {
38 inherit system;
39 };
40
41 runInMachine = testing.runInMachine;
42
43 sphinx = import ./docs/default.nix {};
44
45 mkDocs = kind: stdenv.mkDerivation {
46 name = kind;
47 srcs = [
48 (./. + (builtins.toPath "/${kind}"))
49 (builtins.filterSource
50 (path: type: baseNameOf path == "VERSION")
51 ./rhodecode)
52 ];
53 sourceRoot = kind;
54 buildInputs = [ sphinx ];
55 configurePhase = null;
56 buildPhase = ''
57 make SPHINXBUILD=sphinx-build html
58 '';
59 installPhase = ''
60 mkdir -p $out
61 mv _build/html $out/
62
63 mkdir -p $out/nix-support
64 echo "doc manual $out/html index.html" >> \
65 "$out/nix-support/hydra-build-products"
66 '';
67 };
68
69 enterprise = import ./default.nix {
70 inherit
9 inherit
10 doCheck
71 pkgs;
11 pkgs;
72
12
73 # TODO: for quick local testing
13 # disable checkPhase for build
74 doCheck = false;
14 checkPhase = ''
75 };
15 '';
76
16
77 test-cfg = stdenv.mkDerivation {
78 name = "test-cfg";
79 unpackPhase = "true";
80 buildInputs = [
81 enterprise.src
82 ];
83 installPhase = ''
84 mkdir -p $out/etc
85 cp ${enterprise.src}/test.ini $out/etc/enterprise.ini
86 # TODO: johbo: Needed, so that the login works, this causes
87 # probably some side effects
88 substituteInPlace $out/etc/enterprise.ini --replace "is_test = True" ""
89
90 # Gevent configuration
91 cp $out/etc/enterprise.ini $out/etc/enterprise-gevent.ini;
92 cat >> $out/etc/enterprise-gevent.ini <<EOF
93
94 [server:main]
95 use = egg:gunicorn#main
96 worker_class = gevent
97 EOF
98
99 cp ${enterprise.src}/vcsserver/test.ini $out/etc/vcsserver.ini
100 '';
101 };
102
103 ac-test-drv = import ./acceptance_tests {
104 withExternals = false;
105 };
17 };
106
18
107 # TODO: johbo: Currently abusing buildPythonPackage to make the
19 in {
108 # needed environment for the ac-test tools.
20 build = enterprise_ce;
109 mkAcTests = {
21 }
110 # Path to an INI file which will be used to run Enterprise.
111 #
112 # Intended usage is to provide different configuration files to
113 # run the tests against a different configuration.
114 enterpriseCfg ? "${test-cfg}/etc/enterprise.ini"
115
116 # Path to an INI file which will be used to run the VCSServer.
117 , vcsserverCfg ? "${test-cfg}/etc/vcsserver.ini"
118 }: pkgs.pythonPackages.buildPythonPackage {
119 name = "enterprise-ac-tests";
120 src = ./acceptance_tests;
121
122 buildInputs = with pkgs; [
123 curl
124 enterprise
125 ac-test-drv
126 ];
127
128 buildPhase = ''
129 cp ${enterpriseCfg} enterprise.ini
130
131 echo "Creating a fake home directory"
132 mkdir fake-home
133 export HOME=$PWD/fake-home
134
135 echo "Creating a repository directory"
136 mkdir repos
137
138 echo "Preparing the database"
139 rc-setup-app \
140 --user=admin \
141 --email=admin@example.com \
142 --password=secret \
143 --api-key=9999999999999999999999999999999999999999 \
144 --force-yes \
145 --repos=$PWD/repos \
146 enterprise.ini > /dev/null
147
148 echo "Starting rc-server"
149 vcsserver --config ${vcsserverCfg} >vcsserver.log 2>&1 &
150 rc-server enterprise.ini >rc-server.log 2>&1 &
151
152 while ! curl -f -s http://localhost:5000 > /dev/null
153 do
154 echo "Waiting for server to be ready..."
155 sleep 3
156 done
157 echo "Webserver is ready."
158
159 echo "Starting the test run"
160 py.test -c example.ini -vs --maxfail=5 tests
161
162 echo "Kill rc-server"
163 kill %2
164 kill %1
165 '';
166
167 # TODO: johbo: Use the install phase again once the normal mkDerivation
168 # can be used again.
169 postInstall = ''
170 mkdir -p $out
171 cp enterprise.ini $out
172 cp ${vcsserverCfg} $out/vcsserver.ini
173 cp rc-server.log $out
174 cp vcsserver.log $out
175
176 mkdir -p $out/nix-support
177 echo "report config $out enterprise.ini" >> $out/nix-support/hydra-build-products
178 echo "report config $out vcsserver.ini" >> $out/nix-support/hydra-build-products
179 echo "report rc-server $out rc-server.log" >> $out/nix-support/hydra-build-products
180 echo "report vcsserver $out vcsserver.log" >> $out/nix-support/hydra-build-products
181 '';
182 };
183
184 vcsserver = import <vcsserver> {
185 inherit pkgs;
186
187 # TODO: johbo: Think of a more elegant solution to this problem
188 pythonExternalOverrides = self: super: (enterprise.myPythonPackagesUnfix self);
189 };
190
191 runTests = optionString: (enterprise.override (attrs: {
192 doCheck = true;
193 name = "test-run";
194 buildInputs = attrs.buildInputs ++ [
195 vcsserver
196 ];
197 checkPhase = ''
198 py.test ${optionString} -vv -ra
199 '';
200 buildPhase = attrs.shellHook;
201 installPhase = ''
202 echo "Intentionally not installing anything"
203 '';
204 meta.description = "Enterprise test run ${optionString}";
205 }));
206
207 jobs = {
208
209 build = enterprise;
210
211 # johbo: Currently this is simply running the tests against the sources. Nicer
212 # would be to run xdist and against the installed application, so that we also
213 # cover the impact of installing the application.
214 test-api = runTests "rhodecode/api";
215 test-functional = runTests "rhodecode/tests/functional";
216 test-rest = runTests "rhodecode/tests --ignore=rhodecode/tests/functional";
217 test-full = runTests "rhodecode";
218
219 docs = mkDocs "docs";
220
221 aggregate = pkgs.releaseTools.aggregate {
222 name = "aggregated-jobs";
223 constituents = [
224 jobs.build
225 jobs.test-api
226 jobs.test-rest
227 jobs.docs
228 ];
229 };
230 };
231
232 in jobs
@@ -1,129 +1,129 b''
1 ## core
1 ## dependencies
2 setuptools==30.1.0
3 setuptools-scm==1.15.6
4
2
5 amqp==2.2.2
3 setuptools-scm==2.1.0
4 amqp==2.3.1
6 # not released authomatic that has updated some oauth providers
5 # not released authomatic that has updated some oauth providers
7 https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801#egg=authomatic==0.1.0.post1
6 https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801#egg=authomatic==0.1.0.post1
8 Babel==1.3
7 babel==1.3
9 Beaker==1.9.1
8 beaker==1.9.1
10 celery==4.1.0
9 celery==4.1.1
11 Chameleon==2.24
10 chameleon==2.24
12 channelstream==0.5.2
11 channelstream==0.5.2
13 click==6.6
12 click==6.6
14 colander==1.4.0
13 colander==1.4.0
15 configobj==5.0.6
14 # our custom configobj
16 cssselect==1.0.1
15 https://code.rhodecode.com/upstream/configobj/archive/a11ff0a0bd4fbda9e3a91267e720f88329efb4a6.tar.gz?md5=9916c524ea11a6c418217af6b28d4b3c#egg=configobj==5.0.6
16 cssselect==1.0.3
17 decorator==4.1.2
17 decorator==4.1.2
18 deform==2.0.4
18 deform==2.0.5
19 docutils==0.14.0
19 docutils==0.14.0
20 dogpile.cache==0.6.4
20 dogpile.cache==0.6.6
21 dogpile.core==0.4.1
21 dogpile.core==0.4.1
22 ecdsa==0.13
22 ecdsa==0.13
23 FormEncode==1.2.4
23 formencode==1.2.4
24 future==0.14.3
24 future==0.14.3
25 futures==3.0.2
25 futures==3.0.2
26 gnureadline==6.3.8
26 gnureadline==6.3.8
27 infrae.cache==1.0.1
27 infrae.cache==1.0.1
28 iso8601==0.1.12
28 iso8601==0.1.11
29 itsdangerous==0.24
29 itsdangerous==0.24
30 Jinja2==2.9.6
30 jinja2==2.9.6
31 billiard==3.5.0.3
31 billiard==3.5.0.3
32 kombu==4.1.0
32 kombu==4.2.0
33 lxml==3.7.3
33 lxml==3.7.3
34 Mako==1.0.7
34 mako==1.0.7
35 Markdown==2.6.11
35 markdown==2.6.11
36 MarkupSafe==1.0.0
36 markupsafe==1.0.0
37 msgpack-python==0.4.8
37 msgpack-python==0.5.6
38 MySQL-python==1.2.5
38 mysql-python==1.2.5
39 pymysql==0.8.1
40 pyotp==2.2.6
39 objgraph==3.1.1
41 objgraph==3.1.1
40 packaging==15.2
42 packaging==15.2
41 Paste==2.0.3
43 paste==2.0.3
42 PasteDeploy==1.5.2
44 pastedeploy==1.5.2
43 PasteScript==2.0.2
45 pastescript==2.0.2
44 pathlib2==2.3.0
46 pathlib2==2.3.0
45 peppercorn==0.5
47 peppercorn==0.5
46 psutil==5.4.3
48 psutil==5.4.6
47 psycopg2==2.7.3.2
49 psycopg2==2.7.4
48 py-bcrypt==0.4
50 py-bcrypt==0.4
49 pycrypto==2.6.1
51 pycrypto==2.6.1
50 pycurl==7.19.5
52 pycurl==7.43.0.2
51 pyflakes==0.8.1
53 pyflakes==0.8.1
52 pygments-markdown-lexer==0.1.0.dev39
54 pygments-markdown-lexer==0.1.0.dev39
53 Pygments==2.2.0
55 pygments==2.2.0
54 pyparsing==1.5.7
56 pyparsing==1.5.7
55 pyramid-beaker==0.8
57 pyramid-beaker==0.8
56 pyramid-debugtoolbar==4.3.0
58 pyramid-debugtoolbar==4.4.0
57 pyramid-jinja2==2.7
59 pyramid-jinja2==2.7
58 pyramid-mako==1.0.2
60 pyramid-mako==1.0.2
59 pyramid==1.9.1
61 pyramid==1.9.2
60 pysqlite==2.8.3
62 pysqlite==2.8.3
61 python-dateutil
63 python-dateutil
62 python-ldap==2.4.45
64 python-ldap==3.1.0
63 python-memcached==1.58
65 python-memcached==1.59
64 python-pam==1.8.2
66 python-pam==1.8.4
65 pytz==2018.3
67 pytz==2018.4
66 tzlocal==1.5.1
68 tzlocal==1.5.1
67 pyzmq==14.6.0
69 pyzmq==14.6.0
68 py-gfm==0.1.3
70 py-gfm==0.1.3
69 redis==2.10.6
71 redis==2.10.6
70 repoze.lru==0.7
72 repoze.lru==0.7
71 requests==2.9.1
73 requests==2.9.1
72 Routes==2.4.1
74 routes==2.4.1
73 setproctitle==1.1.10
75 setproctitle==1.1.10
74 simplejson==3.11.1
76 simplejson==3.11.1
75 six==1.11.0
77 six==1.11.0
76 SQLAlchemy==1.1.15
78 sqlalchemy==1.1.18
77 sshpubkeys==2.2.0
79 sshpubkeys==2.2.0
78 subprocess32==3.2.7
80 subprocess32==3.5.1
79 supervisor==3.3.4
81 supervisor==3.3.4
80 Tempita==0.5.2
82 tempita==0.5.2
81 translationstring==1.3
83 translationstring==1.3
82 trollius==1.0.4
84 trollius==1.0.4
83 urllib3==1.16
85 urllib3==1.21
84 URLObject==2.4.0
86 urlobject==2.4.3
85 venusian==1.1.0
87 venusian==1.1.0
86 WebError==0.10.3
88 weberror==0.10.3
87 WebHelpers2==2.0
89 webhelpers2==2.0
88 WebHelpers==1.3
90 webhelpers==1.3
89 WebOb==1.7.4
91 webob==1.7.4
90 Whoosh==2.7.4
92 whoosh==2.7.4
91 wsgiref==0.1.2
93 wsgiref==0.1.2
92 zope.cachedescriptors==4.3.1
94 zope.cachedescriptors==4.3.1
93 zope.deprecation==4.3.0
95 zope.deprecation==4.3.0
94 zope.event==4.3.0
96 zope.event==4.3.0
95 zope.interface==4.4.3
97 zope.interface==4.5.0
96
98
97
99
98 # IPYTHON RENDERING
100 # IPYTHON RENDERING
99 # entrypoints backport, pypi version doesn't support egg installs
101 # entrypoints backport, pypi version doesn't support egg installs
100 https://code.rhodecode.com/upstream/entrypoints/archive/96e6d645684e1af3d7df5b5272f3fe85a546b233.tar.gz?md5=7db37771aea9ac9fefe093e5d6987313#egg=entrypoints==0.2.2.rhodecode-upstream1
102 https://code.rhodecode.com/upstream/entrypoints/archive/96e6d645684e1af3d7df5b5272f3fe85a546b233.tar.gz?md5=7db37771aea9ac9fefe093e5d6987313#egg=entrypoints==0.2.2.rhodecode-upstream1
101 nbconvert==5.3.1
103 nbconvert==5.3.1
102 bleach==2.1.2
104 bleach==2.1.4
103 nbformat==4.4.0
105 nbformat==4.4.0
104 jupyter_client==5.0.0
106 jupyter_client==5.0.0
105
107
106 ## cli tools
108 ## cli tools
107 alembic==0.9.8
109 alembic==0.9.9
108 invoke==0.13.0
110 invoke==0.13.0
109 bumpversion==0.5.3
111 bumpversion==0.5.3
110 transifex-client==0.12.5
111
112
112 ## http servers
113 ## http servers
113 gevent==1.2.2
114 gevent==1.3.5
114 greenlet==0.4.13
115 greenlet==0.4.13
115 gunicorn==19.7.1
116 gunicorn==19.9.0
116 waitress==1.1.0
117 waitress==1.1.0
117 uWSGI==2.0.15
118
118
119 ## debug
119 ## debug
120 ipdb==0.10.3
120 ipdb==0.11.0
121 ipython==5.1.0
121 ipython==5.1.0
122 CProfileV==1.0.7
122 cprofilev==1.0.7
123 bottle==0.12.13
123 bottle==0.12.13
124
124
125 ## rhodecode-tools, special case
125 ## rhodecode-tools, special case
126 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.14.1.tar.gz?md5=0b9c2caad160b68889f8172ea54af7b2#egg=rhodecode-tools==0.14.1
126 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.16.0.tar.gz?md5=87f81286b49156c2ac36f1a1acfa2164#egg=rhodecode-tools==0.16.0
127
127
128 ## appenlight
128 ## appenlight
129 appenlight-client==0.6.25
129 appenlight-client==0.6.25
@@ -1,15 +1,14 b''
1 # test related requirements
1 # test related requirements
2 pytest==3.2.5
2 pytest==3.6.0
3 py==1.5.2
3 py==1.5.3
4 pytest-cov==2.5.1
4 pytest-cov==2.5.1
5 pytest-sugar==0.9.0
5 pytest-sugar==0.9.1
6 pytest-runner==3.0.0
6 pytest-runner==4.2.0
7 pytest-catchlog==1.2.2
7 pytest-profiling==1.3.0
8 pytest-profiling==1.2.11
9 gprof2dot==2017.9.19
8 gprof2dot==2017.9.19
10 pytest-timeout==1.2.0
9 pytest-timeout==1.2.1
11
10
12 mock==1.0.1
11 mock==1.0.1
13 WebTest==2.0.29
12 webtest==2.0.29
14 cov-core==1.15.0
13 cov-core==1.15.0
15 coverage==3.7.1
14 coverage==3.7.1
@@ -1,1 +1,1 b''
1 4.12.4 No newline at end of file
1 4.13.0 No newline at end of file
@@ -51,7 +51,7 b' PYRAMID_SETTINGS = {}'
51 EXTENSIONS = {}
51 EXTENSIONS = {}
52
52
53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
54 __dbversion__ = 86 # defines current db version for migrations
54 __dbversion__ = 90 # defines current db version for migrations
55 __platform__ = platform.system()
55 __platform__ = platform.system()
56 __license__ = 'AGPLv3, and Commercial License'
56 __license__ = 'AGPLv3, and Commercial License'
57 __author__ = 'RhodeCode GmbH'
57 __author__ = 'RhodeCode GmbH'
@@ -208,6 +208,7 b' def request_view(request):'
208
208
209 # register our auth-user
209 # register our auth-user
210 request.rpc_user = auth_u
210 request.rpc_user = auth_u
211 request.environ['rc_auth_user_id'] = auth_u.user_id
211
212
212 # now check if token is valid for API
213 # now check if token is valid for API
213 auth_token = request.rpc_api_key
214 auth_token = request.rpc_api_key
@@ -119,6 +119,7 b' class TestCreatePullRequestApi(object):'
119 'mandatory': True},
119 'mandatory': True},
120 ]
120 ]
121 data['reviewers'] = reviewers
121 data['reviewers'] = reviewers
122
122 id_, params = build_data(
123 id_, params = build_data(
123 self.apikey_regular, 'create_pull_request', **data)
124 self.apikey_regular, 'create_pull_request', **data)
124 response = api_call(self.app, params)
125 response = api_call(self.app, params)
@@ -251,8 +252,9 b' class TestCreatePullRequestApi(object):'
251 id_, params = build_data(
252 id_, params = build_data(
252 self.apikey_regular, 'create_pull_request', **data)
253 self.apikey_regular, 'create_pull_request', **data)
253 response = api_call(self.app, params)
254 response = api_call(self.app, params)
254 expected_message = 'The specified branch `{}` does not exist'.format(
255 expected_message = 'The specified value:{type}:`{name}` ' \
255 branch_name)
256 'does not exist, or is not allowed.'.format(type='branch',
257 name=branch_name)
256 assert_error(id_, expected_message, given=response.body)
258 assert_error(id_, expected_message, given=response.body)
257
259
258 @pytest.mark.backends("git", "hg")
260 @pytest.mark.backends("git", "hg")
@@ -316,6 +318,7 b' class TestCreatePullRequestApi(object):'
316 self.commit_ids = backend.create_master_repo(commits)
318 self.commit_ids = backend.create_master_repo(commits)
317 self.source = backend.create_repo(heads=[source_head])
319 self.source = backend.create_repo(heads=[source_head])
318 self.target = backend.create_repo(heads=[target_head])
320 self.target = backend.create_repo(heads=[target_head])
321
319 data = {
322 data = {
320 'source_repo': self.source.repo_name,
323 'source_repo': self.source.repo_name,
321 'target_repo': self.target.repo_name,
324 'target_repo': self.target.repo_name,
@@ -76,6 +76,8 b' class TestUpdateUser(object):'
76 'user': ret
76 'user': ret
77 }
77 }
78 expected = ret
78 expected = ret
79 expected['user']['last_activity'] = response.json['result']['user'][
80 'last_activity']
79 assert_ok(id_, expected, given=response.body)
81 assert_ok(id_, expected, given=response.body)
80
82
81 def test_api_update_user_by_user_id(self):
83 def test_api_update_user_by_user_id(self):
@@ -91,6 +93,8 b' class TestUpdateUser(object):'
91 'user': ret
93 'user': ret
92 }
94 }
93 expected = ret
95 expected = ret
96 expected['user']['last_activity'] = response.json['result']['user'][
97 'last_activity']
94 assert_ok(id_, expected, given=response.body)
98 assert_ok(id_, expected, given=response.body)
95
99
96 def test_api_update_user_default_user(self):
100 def test_api_update_user_default_user(self):
@@ -87,7 +87,8 b' class TestResolveRefOrError(object):'
87 ref = 'ancestor:ref'
87 ref = 'ancestor:ref'
88 with pytest.raises(JSONRPCError) as excinfo:
88 with pytest.raises(JSONRPCError) as excinfo:
89 utils.resolve_ref_or_error(ref, repo)
89 utils.resolve_ref_or_error(ref, repo)
90 expected_message = 'The specified ancestor `ref` does not exist'
90 expected_message = (
91 'The specified value:ancestor:`ref` does not exist, or is not allowed.')
91 assert excinfo.value.message == expected_message
92 assert excinfo.value.message == expected_message
92
93
93 def test_branch_is_not_found(self):
94 def test_branch_is_not_found(self):
@@ -99,7 +100,7 b' class TestResolveRefOrError(object):'
99 with pytest.raises(JSONRPCError) as excinfo:
100 with pytest.raises(JSONRPCError) as excinfo:
100 utils.resolve_ref_or_error(ref, repo)
101 utils.resolve_ref_or_error(ref, repo)
101 expected_message = (
102 expected_message = (
102 'The specified branch `non-existing-one` does not exist')
103 'The specified value:branch:`non-existing-one` does not exist, or is not allowed.')
103 assert excinfo.value.message == expected_message
104 assert excinfo.value.message == expected_message
104
105
105 def test_bookmark_is_not_found(self):
106 def test_bookmark_is_not_found(self):
@@ -111,7 +112,7 b' class TestResolveRefOrError(object):'
111 with pytest.raises(JSONRPCError) as excinfo:
112 with pytest.raises(JSONRPCError) as excinfo:
112 utils.resolve_ref_or_error(ref, repo)
113 utils.resolve_ref_or_error(ref, repo)
113 expected_message = (
114 expected_message = (
114 'The specified bookmark `non-existing-one` does not exist')
115 'The specified value:bookmark:`non-existing-one` does not exist, or is not allowed.')
115 assert excinfo.value.message == expected_message
116 assert excinfo.value.message == expected_message
116
117
117 @pytest.mark.parametrize("ref", ['ref', '12345', 'a:b:c:d'])
118 @pytest.mark.parametrize("ref", ['ref', '12345', 'a:b:c:d'])
@@ -403,7 +403,7 b' def resolve_ref_or_error(ref, repo):'
403 ref_hash = ref_hash or _get_ref_hash(repo, ref_type, ref_name)
403 ref_hash = ref_hash or _get_ref_hash(repo, ref_type, ref_name)
404 except (KeyError, ValueError):
404 except (KeyError, ValueError):
405 raise JSONRPCError(
405 raise JSONRPCError(
406 'The specified {type} `{name}` does not exist'.format(
406 'The specified value:{type}:`{name}` does not exist, or is not allowed.'.format(
407 type=ref_type, name=ref_name))
407 type=ref_type, name=ref_name))
408
408
409 return ':'.join([ref_type, ref_name, ref_hash])
409 return ':'.join([ref_type, ref_name, ref_hash])
@@ -431,7 +431,6 b' def _get_commit_dict('
431 }
431 }
432
432
433
433
434 # TODO: mikhail: Think about moving this function to some library
435 def _get_ref_hash(repo, type_, name):
434 def _get_ref_hash(repo, type_, name):
436 vcs_repo = repo.scm_instance()
435 vcs_repo = repo.scm_instance()
437 if type_ == 'branch' and vcs_repo.alias in ('hg', 'git'):
436 if type_ == 'branch' and vcs_repo.alias in ('hg', 'git'):
@@ -284,7 +284,7 b' def merge_pull_request('
284 raise JSONRPCError('userid is not the same as your user')
284 raise JSONRPCError('userid is not the same as your user')
285
285
286 check = MergeCheck.validate(
286 check = MergeCheck.validate(
287 pull_request, user=apiuser, translator=request.translate)
287 pull_request, auth_user=apiuser, translator=request.translate)
288 merge_possible = not check.failed
288 merge_possible = not check.failed
289
289
290 if not merge_possible:
290 if not merge_possible:
@@ -302,7 +302,7 b' def merge_pull_request('
302 request.environ, repo_name=target_repo.repo_name,
302 request.environ, repo_name=target_repo.repo_name,
303 username=apiuser.username, action='push',
303 username=apiuser.username, action='push',
304 scm=target_repo.repo_type)
304 scm=target_repo.repo_type)
305 merge_response = PullRequestModel().merge(
305 merge_response = PullRequestModel().merge_repo(
306 pull_request, apiuser, extras=extras)
306 pull_request, apiuser, extras=extras)
307 if merge_response.executed:
307 if merge_response.executed:
308 PullRequestModel().close_pull_request(
308 PullRequestModel().close_pull_request(
@@ -548,7 +548,8 b' def comment_pull_request('
548 closing_pr=False,
548 closing_pr=False,
549 renderer=renderer,
549 renderer=renderer,
550 comment_type=comment_type,
550 comment_type=comment_type,
551 resolves_comment_id=resolves_comment_id
551 resolves_comment_id=resolves_comment_id,
552 auth_user=apiuser
552 )
553 )
553
554
554 if allowed_to_change_status and status:
555 if allowed_to_change_status and status:
@@ -573,7 +574,8 b' def comment_pull_request('
573 @jsonrpc_method()
574 @jsonrpc_method()
574 def create_pull_request(
575 def create_pull_request(
575 request, apiuser, source_repo, target_repo, source_ref, target_ref,
576 request, apiuser, source_repo, target_repo, source_ref, target_ref,
576 title=Optional(''), description=Optional(''), reviewers=Optional(None)):
577 title=Optional(''), description=Optional(''), description_renderer=Optional(''),
578 reviewers=Optional(None)):
577 """
579 """
578 Creates a new pull request.
580 Creates a new pull request.
579
581
@@ -598,6 +600,10 b' def create_pull_request('
598 :type title: str
600 :type title: str
599 :param description: Set the pull request description.
601 :param description: Set the pull request description.
600 :type description: Optional(str)
602 :type description: Optional(str)
603 :type description_renderer: Optional(str)
604 :param description_renderer: Set pull request renderer for the description.
605 It should be 'rst', 'markdown' or 'plain'. If not give default
606 system renderer will be used
601 :param reviewers: Set the new pull request reviewers list.
607 :param reviewers: Set the new pull request reviewers list.
602 Reviewer defined by review rules will be added automatically to the
608 Reviewer defined by review rules will be added automatically to the
603 defined list.
609 defined list.
@@ -607,7 +613,7 b' def create_pull_request('
607 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
613 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
608 """
614 """
609
615
610 source_db_repo = get_repo_or_error(source_repo)
616 source_db_repo = get_repo_or_error(source_repo)
611 target_db_repo = get_repo_or_error(target_repo)
617 target_db_repo = get_repo_or_error(target_repo)
612 if not has_superadmin_permission(apiuser):
618 if not has_superadmin_permission(apiuser):
613 _perms = ('repository.admin', 'repository.write', 'repository.read',)
619 _perms = ('repository.admin', 'repository.write', 'repository.read',)
@@ -678,7 +684,11 b' def create_pull_request('
678 source_ref=title_source_ref,
684 source_ref=title_source_ref,
679 target=target_repo
685 target=target_repo
680 )
686 )
687 # fetch renderer, if set fallback to plain in case of PR
688 rc_config = SettingsModel().get_all_settings()
689 default_system_renderer = rc_config.get('rhodecode_markup_renderer', 'plain')
681 description = Optional.extract(description)
690 description = Optional.extract(description)
691 description_renderer = Optional.extract(description_renderer) or default_system_renderer
682
692
683 pull_request = PullRequestModel().create(
693 pull_request = PullRequestModel().create(
684 created_by=apiuser.user_id,
694 created_by=apiuser.user_id,
@@ -690,7 +700,9 b' def create_pull_request('
690 reviewers=reviewers,
700 reviewers=reviewers,
691 title=title,
701 title=title,
692 description=description,
702 description=description,
703 description_renderer=description_renderer,
693 reviewer_data=reviewer_rules,
704 reviewer_data=reviewer_rules,
705 auth_user=apiuser
694 )
706 )
695
707
696 Session().commit()
708 Session().commit()
@@ -704,8 +716,8 b' def create_pull_request('
704 @jsonrpc_method()
716 @jsonrpc_method()
705 def update_pull_request(
717 def update_pull_request(
706 request, apiuser, pullrequestid, repoid=Optional(None),
718 request, apiuser, pullrequestid, repoid=Optional(None),
707 title=Optional(''), description=Optional(''), reviewers=Optional(None),
719 title=Optional(''), description=Optional(''), description_renderer=Optional(''),
708 update_commits=Optional(None)):
720 reviewers=Optional(None), update_commits=Optional(None)):
709 """
721 """
710 Updates a pull request.
722 Updates a pull request.
711
723
@@ -719,6 +731,9 b' def update_pull_request('
719 :type title: str
731 :type title: str
720 :param description: Update pull request description.
732 :param description: Update pull request description.
721 :type description: Optional(str)
733 :type description: Optional(str)
734 :type description_renderer: Optional(str)
735 :param description_renderer: Update pull request renderer for the description.
736 It should be 'rst', 'markdown' or 'plain'
722 :param reviewers: Update pull request reviewers list with new value.
737 :param reviewers: Update pull request reviewers list with new value.
723 :type reviewers: Optional(list)
738 :type reviewers: Optional(list)
724 Accepts username strings or objects of the format:
739 Accepts username strings or objects of the format:
@@ -801,10 +816,15 b' def update_pull_request('
801
816
802 title = Optional.extract(title)
817 title = Optional.extract(title)
803 description = Optional.extract(description)
818 description = Optional.extract(description)
819 description_renderer = Optional.extract(description_renderer)
820
804 if title or description:
821 if title or description:
805 PullRequestModel().edit(
822 PullRequestModel().edit(
806 pull_request, title or pull_request.title,
823 pull_request,
807 description or pull_request.description, apiuser)
824 title or pull_request.title,
825 description or pull_request.description,
826 description_renderer or pull_request.description_renderer,
827 apiuser)
808 Session().commit()
828 Session().commit()
809
829
810 commit_changes = {"added": [], "common": [], "removed": []}
830 commit_changes = {"added": [], "common": [], "removed": []}
@@ -1469,7 +1469,8 b' def comment_commit('
1469 status_change_type=status,
1469 status_change_type=status,
1470 renderer=renderer,
1470 renderer=renderer,
1471 comment_type=comment_type,
1471 comment_type=comment_type,
1472 resolves_comment_id=resolves_comment_id
1472 resolves_comment_id=resolves_comment_id,
1473 auth_user=apiuser
1473 )
1474 )
1474 if status:
1475 if status:
1475 # also do a status change
1476 # also do a status change
@@ -461,31 +461,38 b' class RepoRoutePredicate(object):'
461 phash = text
461 phash = text
462
462
463 def __call__(self, info, request):
463 def __call__(self, info, request):
464
465 if hasattr(request, 'vcs_call'):
464 if hasattr(request, 'vcs_call'):
466 # skip vcs calls
465 # skip vcs calls
467 return
466 return
468
467
469 repo_name = info['match']['repo_name']
468 repo_name = info['match']['repo_name']
470 repo_model = repo.RepoModel()
469 repo_model = repo.RepoModel()
471 by_name_match = repo_model.get_by_repo_name(repo_name, cache=True)
470
471 by_name_match = repo_model.get_by_repo_name(repo_name, cache=False)
472
472
473 def redirect_if_creating(db_repo):
473 def redirect_if_creating(route_info, db_repo):
474 skip_views = ['edit_repo_advanced_delete']
475 route = route_info['route']
476 # we should skip delete view so we can actually "remove" repositories
477 # if they get stuck in creating state.
478 if route.name in skip_views:
479 return
480
474 if db_repo.repo_state in [repo.Repository.STATE_PENDING]:
481 if db_repo.repo_state in [repo.Repository.STATE_PENDING]:
475 raise HTTPFound(
482 repo_creating_url = request.route_path(
476 request.route_path('repo_creating',
483 'repo_creating', repo_name=db_repo.repo_name)
477 repo_name=db_repo.repo_name))
484 raise HTTPFound(repo_creating_url)
478
485
479 if by_name_match:
486 if by_name_match:
480 # register this as request object we can re-use later
487 # register this as request object we can re-use later
481 request.db_repo = by_name_match
488 request.db_repo = by_name_match
482 redirect_if_creating(by_name_match)
489 redirect_if_creating(info, by_name_match)
483 return True
490 return True
484
491
485 by_id_match = repo_model.get_repo_by_id(repo_name)
492 by_id_match = repo_model.get_repo_by_id(repo_name)
486 if by_id_match:
493 if by_id_match:
487 request.db_repo = by_id_match
494 request.db_repo = by_id_match
488 redirect_if_creating(by_id_match)
495 redirect_if_creating(info, by_id_match)
489 return True
496 return True
490
497
491 return False
498 return False
@@ -516,7 +523,7 b' class RepoTypeRoutePredicate(object):'
516 else:
523 else:
517 log.warning('Current view is not supported for repo type:%s',
524 log.warning('Current view is not supported for repo type:%s',
518 rhodecode_db_repo.repo_type)
525 rhodecode_db_repo.repo_type)
519 #
526
520 # h.flash(h.literal(
527 # h.flash(h.literal(
521 # _('Action not supported for %s.' % rhodecode_repo.alias)),
528 # _('Action not supported for %s.' % rhodecode_repo.alias)),
522 # category='warning')
529 # category='warning')
@@ -542,8 +549,7 b' class RepoGroupRoutePredicate(object):'
542
549
543 repo_group_name = info['match']['repo_group_name']
550 repo_group_name = info['match']['repo_group_name']
544 repo_group_model = repo_group.RepoGroupModel()
551 repo_group_model = repo_group.RepoGroupModel()
545 by_name_match = repo_group_model.get_by_group_name(
552 by_name_match = repo_group_model.get_by_group_name(repo_group_name, cache=False)
546 repo_group_name, cache=True)
547
553
548 if by_name_match:
554 if by_name_match:
549 # register this as request object we can re-use later
555 # register this as request object we can re-use later
@@ -569,8 +575,7 b' class UserGroupRoutePredicate(object):'
569
575
570 user_group_id = info['match']['user_group_id']
576 user_group_id = info['match']['user_group_id']
571 user_group_model = user_group.UserGroup()
577 user_group_model = user_group.UserGroup()
572 by_id_match = user_group_model.get(
578 by_id_match = user_group_model.get(user_group_id, cache=False)
573 user_group_id, cache=True)
574
579
575 if by_id_match:
580 if by_id_match:
576 # register this as request object we can re-use later
581 # register this as request object we can re-use later
@@ -596,8 +601,7 b' class UserRoutePredicateBase(object):'
596
601
597 user_id = info['match']['user_id']
602 user_id = info['match']['user_id']
598 user_model = user.User()
603 user_model = user.User()
599 by_id_match = user_model.get(
604 by_id_match = user_model.get(user_id, cache=False)
600 user_id, cache=True)
601
605
602 if by_id_match:
606 if by_id_match:
603 # register this as request object we can re-use later
607 # register this as request object we can re-use later
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/lib/memory_lru_debug.py to rhodecode/lib/memory_lru_dict.py
NO CONTENT: file renamed from rhodecode/lib/memory_lru_debug.py to rhodecode/lib/memory_lru_dict.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from rhodecode/tests/controllers/test_utils.py to rhodecode/tests/other/test_views_utils.py
NO CONTENT: file renamed from rhodecode/tests/controllers/test_utils.py to rhodecode/tests/other/test_views_utils.py
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now