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

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

@@ -0,0 +1,10 b''
1 {
2 "presets": [
3 ["env", {
4 "targets": {
5 "browsers": ["last 2 versions"]
6 }
7 }]
8 ],
9 "plugins": ["transform-object-rest-spread"]
10 }
@@ -0,0 +1,44 b''
1 .. _integrations-rcextensions:
2
3
4 rcextensions integrations
5 =========================
6
7
8 Since RhodeCode 4.14 release rcextensions aren't part of rhodecode-tools, and instead
9 they are shipped with the new or upgraded installations.
10
11 The rcextensions template `rcextensions.tmpl` is created in the `etc/` directory
12 of enterprise or community installation. It's always re-created and updated on upgrades.
13
14
15 Activating rcextensions
16 +++++++++++++++++++++++
17
18 To activate rcextensions simply copy or rename the created template rcextensions
19 into the path where the rhodecode.ini file is located::
20
21 pushd ~/rccontrol/enterprise-1/
22 or
23 pushd ~/rccontrol/community-1/
24
25 mv etc/rcextensions.tmpl rcextensions
26
27
28 rcextensions are loaded when |RCE| starts. So a restart is required after activation or
29 change of code in rcextensions.
30
31 Simply restart only the enterprise/community instance::
32
33 rccontrol restart enterprise-1
34 or
35 rccontrol restart community-1
36
37
38 Example usage
39 +++++++++++++
40
41
42 To see examples of usage please check the examples directory under:
43
44 https://code.rhodecode.com/rhodecode-enterprise-ce/files/stable/rhodecode/config/rcextensions/examples
@@ -0,0 +1,114 b''
1 |RCE| 4.14.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2018-11-02
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - Diffs: expose range diff inside the PR view. It's now possible to show
14 commit-per-commit view of changes in pull request.
15 - Diffs: new sticky context bar.
16 When browsing diffs we show file path of the current diff so users are aware all the time
17 what file they are reviewing.
18 - Diffs: added quick file selector in diffs views. Now it's possible to select a file
19 in large diffs from the sticky header for quicker access to certain interesting files
20 in diffs.
21 - Diffs: introducing diff menu for whitespace toggle and context changes.
22 It's now possible to show/hide whitespace changes and toggle the file context in
23 all diff places including pull requests.
24 - Comments: allow commenting on empty files without content.
25 - Repositories: added option to archive repositories instead of deleting them.
26 Archived repositories are useful for future auditing, but they are read-only.
27 - rcextensions: new rcextensions. We're introducing new `rcextensions` that will be base
28 for future low-level integrations. It's now possible to expose nice messages back
29 to the users when using `rcextensions`.
30 - Summary page: slightly re-organize summary page for better user experience.
31
32
33 General
34 ^^^^^^^
35
36 - Mailing: switched from custom library to pyramid_mailer with python3 compatibility.
37 - Frontend: Switched to Polymer 3.0.
38 - Frontend: fixed problems with IE11 and brought back support for that browser.
39 - Git: use a fetch_sync based creation of remote repositories.
40 This fixes problems with importing from Bitbucket.
41 - Comments: update comments email templates.
42 - Packaging: only wrap external dependency scripts. This makes execution of scripts
43 roughly 5x faster due to much smaller PATH tree.
44 - HTTP: use application wide detection of invalid bytes sent via URL/GET/POST data.
45 - Fonts/UI: use consistent fonts across the whole application.
46 Few places had non-standard custom fonts.
47 - Google: updated google auth plugin with latest API changes.
48 - Core: handle edge case requesting matched routes but with hg/svn/git or api context.
49 - Dependencies: bumped rhodecode-tools to 1.0.0 release using Apache2 license.
50 - Dependencies: atomicwrites==1.2.1
51 - Dependencies: attrs==18.2.0
52 - Dependencies: dogpile.cache==0.6.7
53 - Dependencies: psutil==5.4.7
54 - Dependencies: pathlib2==2.3.2
55 - Dependencies: subprocess32==3.5.2
56 - Dependencies: gevent==1.3.6
57 - Dependencies: greenlet==0.4.15
58 - Dependencies: pytest==3.8.2
59 - Dependencies: py==1.6.0
60 - Dependencies: pytest-cov==2.6.0
61 - Dependencies: pytest-timeout==1.3.2
62 - Dependencies: coverage==4.5.1
63 - Dependencies: psycopg2==2.7.5
64
65
66 Security
67 ^^^^^^^^
68
69 - RST: improve Javascript RST sandbox.
70 - Jupyter: sanitize markdown cells similar as we do for our own markdown cleanup.
71
72
73 Performance
74 ^^^^^^^^^^^
75
76 - SSH: improved SSH wrapper execution speed by using optimized binary script wrapping.
77 - Core: reduced font and JavaScript load times.
78
79
80 Fixes
81 ^^^^^
82
83 - Comments: ensure we always display unmatched comments.
84 - Branch Permissions: fixed changing rule order for branch permissions.
85 - Users: ensure get_first_superadmin actually gets the 1st created super-admin.
86 - Users: when deleting users ensure we also clear personal flag.
87 This fixes some problems with multiple personal groups.
88 - Diffs: disable the error border on highlight errors.
89 - Integrations: implement retry to HTTP[S] calls for integrations.
90 Web parts will do a 3x retry call in case service is not reachable or
91 responds with 5XX codes.
92 - Git: fixed pull-request updates in case branch names are the same as the file names.
93 - Supervisor: add patch for older kernel support.
94 - Compare: fixed file after/before links in compare view for cross repo compare.
95 - Emails: improve fonts and rendering of email HTML.
96 - Permissions: flush members of user groups permissions to clear caches.
97 - Repository: add check preventing of removal of repo with attached pull requests. Users
98 should use the new archive repo function instead.
99
100
101 Upgrade notes
102 ^^^^^^^^^^^^^
103
104 - In this release, we're shipping a new `rcextensions`. The changes made are
105 backward incompatible. An update of `rcextensions` is required
106 prior to using them again. Please check the new `rcextensions.tmpl` directory
107 located in `etc/rcextensions.tmpl` in your instance installation path.
108 Old code should be 100% portable by just copy&paste to the right function.
109
110 - Mailing: We introduced a new mailing library. The older options should be compatible and
111 generally, old configuration doesn't need any changes in order to send emails.
112 We, however, encourage users to re-check mailing setup in case of some more
113 sophisticated email setups.
114 There's a possibility to send a test email from admin > settings > email section.
@@ -0,0 +1,3 b''
1 self: super: {
2
3 }
@@ -0,0 +1,16 b''
1 diff -rup supervisor-3.3.4-orig/supervisor/options.py supervisor-3.3.4/supervisor/options.py
2 --- supervisor-3.3.4-orig/supervisor/options.py 1970-01-01 01:00:01.000000000 +0100
3 +++ supervisor-3.3.4/supervisor-new/options.py 2018-10-24 10:53:19.368503735 +0200
4 @@ -1395,7 +1395,11 @@ class ServerOptions(Options):
5 name = limit['name']
6 name = name # name is used below by locals()
7
8 - soft, hard = resource.getrlimit(res)
9 + try:
10 + soft, hard = resource.getrlimit(res)
11 + except Exception:
12 + # handle old kernel problems, this is not critical to execute
13 + soft, hard = -1, -1
14
15 if (soft < min) and (soft != -1): # -1 means unlimited
16 if (hard < min) and (hard != -1):
@@ -0,0 +1,3 b''
1 ## special libraries we could extend the requirements.txt file with to add some
2 ## custom libraries usefull for debug and memory tracing
3 objgraph==3.1.1
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
1 NO CONTENT: new file 100644
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,5 +1,5 b''
1 1 [bumpversion]
2 current_version = 4.13.3
2 current_version = 4.14.0
3 3 message = release: Bump version {current_version} to {new_version}
4 4
5 5 [bumpversion:file:rhodecode/VERSION]
@@ -24,7 +24,6 b' syntax: regexp'
24 24 ^.dev
25 25 ^._dev
26 26 ^build/
27 ^bower_components/
28 27 ^coverage\.xml$
29 28 ^data$
30 29 ^\.eggs/
@@ -36,14 +35,15 b' syntax: regexp'
36 35 ^htmlcov
37 36 ^junit\.xml$
38 37 ^node_modules/
38 ^node_binaries/
39 39 ^pylint.log$
40 40 ^rcextensions/
41 41 ^result$
42 42 ^rhodecode/public/css/style.css$
43 43 ^rhodecode/public/css/style-polymer.css$
44 44 ^rhodecode/public/js/rhodecode-components.html$
45 ^rhodecode/public/js/rhodecode-components.js$
45 46 ^rhodecode/public/js/scripts.js$
46 ^rhodecode/public/js/rhodecode-components.js$
47 47 ^rhodecode/public/js/src/components/root-styles.gen.html$
48 48 ^rhodecode/public/js/vendors/webcomponentsjs/
49 49 ^rhodecode\.db$
@@ -5,25 +5,20 b' done = false'
5 5 done = true
6 6
7 7 [task:rc_tools_pinned]
8 done = true
9 8
10 9 [task:fixes_on_stable]
11 done = true
12 10
13 11 [task:pip2nix_generated]
14 done = true
15 12
16 13 [task:changelog_updated]
17 done = true
18 14
19 15 [task:generate_api_docs]
20 done = true
16
17 [task:updated_translation]
21 18
22 19 [release]
23 state = prepared
24 version = 4.13.3
25
26 [task:updated_translation]
20 state = in_progress
21 version = 4.14.0
27 22
28 23 [task:generate_js_routes]
29 24
@@ -1,4 +1,12 b''
1 1 var gruntConfig = require('./grunt_config.json');
2 var webpackConfig = require('./webpack.config');
3 gruntConfig["webpack"] = {
4 options: {
5 stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
6 },
7 prod: webpackConfig,
8 dev: Object.assign({ watch: false }, webpackConfig)
9 };
2 10
3 11 module.exports = function(grunt) {
4 12 grunt.initConfig(gruntConfig);
@@ -7,9 +15,7 b' module.exports = function(grunt) {'
7 15 grunt.loadNpmTasks('grunt-contrib-concat');
8 16 grunt.loadNpmTasks('grunt-contrib-watch');
9 17 grunt.loadNpmTasks('grunt-contrib-jshint');
10 grunt.loadNpmTasks('grunt-vulcanize');
11 grunt.loadNpmTasks('grunt-crisper');
12 18 grunt.loadNpmTasks('grunt-contrib-copy');
13
14 grunt.registerTask('default', ['less:production', 'less:components', 'concat:polymercss', 'copy', 'concat:dist', 'vulcanize', 'crisper']);
19 grunt.loadNpmTasks('grunt-webpack');
20 grunt.registerTask('default', ['less:production', 'less:components', 'copy', 'webpack', 'concat:dist']);
15 21 };
@@ -39,7 +39,6 b' include rhodecode/public/sounds/*.mp3'
39 39 include rhodecode/public/sounds/*.wav
40 40
41 41 # fonts
42 recursive-include rhodecode/public/fonts/ProximaNova *
43 42 recursive-include rhodecode/public/fonts/RCIcons *
44 43
45 44 # js
@@ -1,9 +1,9 b''
1 1
2 2 .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build
3 3
4 WEBPACK=./node_modules/webpack/bin/webpack.js
5 GRUNT=grunt
6 4 NODE_PATH=./node_modules
5 WEBPACK=./node_binaries/webpack
6 GRUNT=./node_binaries/grunt
7 7
8 8
9 9 clean:
@@ -26,8 +26,6 b' debug = true'
26 26 #smtp_port =
27 27 #smtp_use_tls = false
28 28 #smtp_use_ssl = true
29 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
30 #smtp_auth =
31 29
32 30 [server:main]
33 31 ## COMMON ##
@@ -281,8 +279,10 b' supervisor.group_id = dev'
281 279 ## Display extended labs settings
282 280 labs_settings_active = true
283 281
284 ## custom exception store path, defaults to TMPDIR
285 exception_tracker.store_path =
282 ## Custom exception store path, defaults to TMPDIR
283 ## This is used to store exception from RhodeCode in shared directory
284 #exception_tracker.store_path =
285
286 286
287 287 ####################################
288 288 ### CELERY CONFIG ####
@@ -506,7 +506,7 b' debug_style = true'
506 506 ###########################################
507 507 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
508 508 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
509 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
509 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
510 510 # pymysql is an alternative driver for MySQL, use in case of problems with default one
511 511 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
512 512
@@ -26,8 +26,6 b' debug = true'
26 26 #smtp_port =
27 27 #smtp_use_tls = false
28 28 #smtp_use_ssl = true
29 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
30 #smtp_auth =
31 29
32 30 [server:main]
33 31 ## COMMON ##
@@ -256,8 +254,9 b' supervisor.group_id = prod'
256 254 ## Display extended labs settings
257 255 labs_settings_active = true
258 256
259 ## custom exception store path, defaults to TMPDIR
260 exception_tracker.store_path =
257 ## Custom exception store path, defaults to TMPDIR
258 ## This is used to store exception from RhodeCode in shared directory
259 #exception_tracker.store_path =
261 260
262 261
263 262 ####################################
@@ -480,7 +479,7 b' set debug = false'
480 479 ###########################################
481 480 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
482 481 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
483 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
482 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
484 483 # pymysql is an alternative driver for MySQL, use in case of problems with default one
485 484 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
486 485
@@ -9,7 +9,7 b''
9 9 # {
10 10 # # Thoughts on how to configure the dev environment
11 11 # rc = {
12 # codeInternalUrl = "https://usr:token@internal-code.rhodecode.com";
12 # codeInternalUrl = "https://usr:token@code.rhodecode.com/internal";
13 13 # sources = {
14 14 # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver";
15 15 # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce";
@@ -26,10 +26,18 b' args@'
26 26 }:
27 27
28 28 let
29 # Use nixpkgs from args or import them. We use this indirect approach
30 # through args to be able to use the name `pkgs` for our customized packages.
31 # Otherwise we will end up with an infinite recursion.
32 pkgs = args.pkgs or (import <nixpkgs> { });
29 pkgs_ = (import <nixpkgs> {});
30 in
31
32 let
33 pkgs = import <nixpkgs> {
34 overlays = [
35 (import ./pkgs/overlays.nix)
36 ];
37 inherit
38 (pkgs_)
39 system;
40 };
33 41
34 42 # Works with the new python-packages, still can fallback to the old
35 43 # variant.
@@ -46,7 +54,7 b' let'
46 54 in
47 55 !builtins.elem (basename path) [
48 56 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
49 "bower_components" "node_modules"
57 "node_modules" "node_binaries"
50 58 "build" "data" "result" "tmp"] &&
51 59 !builtins.elem ext ["egg-info" "pyc"] &&
52 60 # TODO: johbo: This check is wrong, since "path" contains an absolute path,
@@ -55,7 +63,11 b' let'
55 63
56 64 sources =
57 65 let
58 inherit (pkgs.lib) all isString attrValues;
66 inherit
67 (pkgs.lib)
68 all
69 isString
70 attrValues;
59 71 sourcesConfig = pkgs.config.rc.sources or {};
60 72 in
61 73 # Ensure that sources are configured as strings. Using a path
@@ -66,18 +78,12 b' let'
66 78 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
67 79 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
68 80
69 buildBowerComponents = pkgs.buildBowerComponents;
70 81 nodeEnv = import ./pkgs/node-default.nix {
71 inherit pkgs;
82 inherit
83 pkgs;
72 84 };
73 85 nodeDependencies = nodeEnv.shell.nodeDependencies;
74 86
75 bowerComponents = buildBowerComponents {
76 name = "enterprise-ce-${version}";
77 generated = ./pkgs/bower-packages.nix;
78 src = rhodecode-enterprise-ce-src;
79 };
80
81 87 rhodecode-testdata-src = sources.rhodecode-testdata or (
82 88 pkgs.fetchhg {
83 89 url = "https://code.rhodecode.com/upstream/rc_testdata";
@@ -95,23 +101,22 b' let'
95 101 pythonLocalOverrides = self: super: {
96 102 rhodecode-enterprise-ce =
97 103 let
98 linkNodeAndBowerPackages = ''
104 linkNodePackages = ''
99 105 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
100 106
101 echo "[BEGIN]: Link node packages"
102 rm -fr node_modules
103 mkdir node_modules
107 echo "[BEGIN]: Link node packages and binaries"
104 108 # johbo: Linking individual packages allows us to run "npm install"
105 109 # inside of a shell to try things out. Re-entering the shell will
106 110 # restore a clean environment.
111 rm -fr node_modules
112 mkdir node_modules
107 113 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
108 echo "[DONE]: Link node packages"
114 export NODE_PATH=./node_modules
109 115
110 echo "[BEGIN]: Link bower packages"
111 rm -fr bower_components
112 mkdir bower_components
113 ln -s ${bowerComponents}/bower_components/* bower_components/
114 echo "[DONE]: Link bower packages"
116 rm -fr node_binaries
117 mkdir node_binaries
118 ln -s ${nodeDependencies}/bin/* node_binaries/
119 echo "[DONE ]: Link node packages and binaries"
115 120 '';
116 121
117 122 releaseName = "RhodeCodeEnterpriseCE-${version}";
@@ -129,8 +134,7 b' let'
129 134 passthru = {
130 135 inherit
131 136 rhodecode-testdata
132 bowerComponents
133 linkNodeAndBowerPackages
137 linkNodePackages
134 138 myPythonPackagesUnfix
135 139 pythonLocalOverrides
136 140 pythonCommunityOverrides;
@@ -141,8 +145,6 b' let'
141 145 buildInputs =
142 146 attrs.buildInputs or [] ++ [
143 147 rhodecode-testdata
144 pkgs.nodePackages.bower
145 pkgs.nodePackages.grunt-cli
146 148 ];
147 149
148 150 #NOTE: option to inject additional propagatedBuildInputs
@@ -175,39 +177,66 b' let'
175 177 '';
176 178
177 179 preBuild = ''
178
179 echo "Building frontend assets"
180 ${linkNodeAndBowerPackages}
181 grunt
180 echo "[BEGIN]: Building frontend assets"
181 ${linkNodePackages}
182 make web-build
182 183 rm -fr node_modules
184 rm -fr node_binaries
185 echo "[DONE ]: Building frontend assets"
183 186 '';
184 187
185 188 postInstall = ''
189 # check required files
190 STATIC_CHECK="/robots.txt /502.html
191 /js/scripts.js /js/rhodecode-components.js
192 /css/style.css /css/style-polymer.css"
193
194 for file in $STATIC_CHECK;
195 do
196 if [ ! -f rhodecode/public/$file ]; then
197 echo "Missing $file"
198 exit 1
199 fi
200 done
201
186 202 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
187 203 mkdir -p $out/nix-support/rccontrol
188 204 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
189 echo "[DONE]: enterprise-ce meta information for rccontrol written"
205 echo "[DONE ]: enterprise-ce meta information for rccontrol written"
190 206
191 207 mkdir -p $out/etc
192 208 cp configs/production.ini $out/etc
193 echo "[DONE]: saved enterprise-ce production.ini into $out/etc"
209 echo "[DONE ]: saved enterprise-ce production.ini into $out/etc"
210
211 cp -Rf rhodecode/config/rcextensions $out/etc/rcextensions.tmpl
212 echo "[DONE ]: saved enterprise-ce rcextensions into $out/etc/rcextensions.tmpl"
194 213
195 214 # python based programs need to be wrapped
196 215 mkdir -p $out/bin
197 # rhodecode-tools
198 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
199 216
200 217 # required binaries from dependencies
201 #ln -s ${self.python}/bin/python $out/bin
202 ln -s ${self.pyramid}/bin/* $out/bin/
203 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
204 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
218 ln -s ${self.supervisor}/bin/supervisorctl $out/bin/
219 ln -s ${self.supervisor}/bin/supervisord $out/bin/
205 220 ln -s ${self.pastescript}/bin/paster $out/bin/
206 221 ln -s ${self.channelstream}/bin/channelstream $out/bin/
207 222 ln -s ${self.celery}/bin/celery $out/bin/
208 echo "[DONE]: created symlinks into $out/bin"
223 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
224 ln -s ${self.pyramid}/bin/prequest $out/bin/
225 ln -s ${self.pyramid}/bin/pserve $out/bin/
209 226
210 for file in $out/bin/*;
227 echo "[DONE ]: created symlinks into $out/bin"
228 DEPS="$out/bin/supervisorctl \
229 $out/bin/supervisord \
230 $out/bin/paster \
231 $out/bin/channelstream \
232 $out/bin/celery \
233 $out/bin/gunicorn \
234 $out/bin/prequest \
235 $out/bin/pserve"
236
237 # wrap only dependency scripts, they require to have full PYTHONPATH set
238 # to be able to import all packages
239 for file in $DEPS;
211 240 do
212 241 wrapProgram $file \
213 242 --prefix PATH : $PATH \
@@ -215,16 +244,18 b' let'
215 244 --set PYTHONHASHSEED random
216 245 done
217 246
218 echo "[DONE]: enterprise-ce binary wrapping"
247 echo "[DONE ]: enterprise-ce binary wrapping"
248
249 # rhodecode-tools don't need wrapping
250 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
219 251
220 if [ ! -f rhodecode/public/js/scripts.js ]; then
221 echo "Missing scripts.js"
222 exit 1
223 fi
224 if [ ! -f rhodecode/public/css/style.css ]; then
225 echo "Missing style.css"
226 exit 1
227 fi
252 # expose sources of CE
253 ln -s $out $out/etc/rhodecode_enterprise_ce_source
254
255 # expose static files folder
256 cp -Rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/public/ $out/etc/static
257 chmod 755 -R $out/etc/static
258
228 259 '';
229 260 });
230 261
@@ -237,8 +268,13 b' let'
237 268 getAttr pythonPackages pkgs;
238 269
239 270 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
240 inherit pkgs;
241 inherit (pkgs) fetchurl fetchgit fetchhg;
271 inherit
272 pkgs;
273 inherit
274 (pkgs)
275 fetchurl
276 fetchgit
277 fetchhg;
242 278 };
243 279
244 280 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
@@ -162,7 +162,8 b' To add custom hooks to your instance, us'
162 162
163 163 1. Open :menuselection:`Admin --> Settings --> Hooks`
164 164 2. Add your custom hook details, you can use a file path to specify custom
165 hook scripts, for example: ``python:/path/to/custom_hook.py``
165 hook scripts, for example:
166 ``pretxnchangegroup.example`` with value ``python:/path/to/custom_hook.py:my_func_name``
166 167 3. Select :guilabel:`Save`
167 168
168 169 Also, see the |RC| Extensions section of the :ref:`rc-tools` guide. |RC|
@@ -18,8 +18,8 b' Prerequisites'
18 18 .. tip::
19 19
20 20 We recommend using Wandisco repositories which provide latest SVN versions
21 for most platforms. Below is example how to add the wandisco repositories
22 for Ubuntu.
21 for most platforms.
22 Here is an example how to add the Wandisco repositories for Ubuntu.
23 23
24 24 .. code-block:: bash
25 25
@@ -27,15 +27,28 b' Prerequisites'
27 27 $ sudo wget -q http://opensource.wandisco.com/wandisco-debian.gpg -O- | sudo apt-key add -
28 28 $ sudo apt-get update
29 29
30 Here is an example how to add the Wandisco repositories for Centos/Redhat. Using
31 a yum config
30 32
31 Using Ubuntu 14.04/16.04 Distribution as an example execute the following to
32 install required components:
33 .. code-block:: bash
34
35 [wandisco-Git]
36 name=CentOS-6 - Wandisco Git
37 baseurl=http://opensource.wandisco.com/centos/6/git/$basearch/
38 enabled=1
39 gpgcheck=1
40 gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
41
42
43
44 Example installation of required components for Ubuntu platform:
33 45
34 46 .. code-block:: bash
35 47
36 $ sudo apt-get install apache2 libapache2-mod-svn
48 $ sudo apt-get install apache2
49 $ sudo apt-get install libapache2-mod-svn
37 50
38 Once installed you need to enable ``dav_svn``:
51 Once installed you need to enable ``dav_svn`` on Ubuntu:
39 52
40 53 .. code-block:: bash
41 54
@@ -44,6 +57,26 b' Once installed you need to enable ``dav_'
44 57 $ sudo a2enmod authn_anon
45 58
46 59
60 Example installation of required components for RedHat/CentOS platform:
61
62 .. code-block:: bash
63
64 $ sudo yum install httpd
65 $ sudo yum install subversion mod_dav_svn
66
67
68 Once installed you need to enable ``dav_svn`` on RedHat/CentOS:
69
70 .. code-block:: bash
71
72 sudo vi /etc/httpd/conf.modules.d/10-subversion.conf
73 ## The file should read:
74
75 LoadModule dav_svn_module modules/mod_dav_svn.so
76 LoadModule headers_module modules/mod_headers.so
77 LoadModule authn_anon_module modules/mod_authn_anon.so
78
79
47 80 Configuring Apache Setup
48 81 ========================
49 82
@@ -13,48 +13,4 b' dependencies for Python and JavaScript w'
13 13 this section to generate the needed Nix derivations.
14 14
15 15
16 Python dependencies
17 ===================
18
19 We use the tool `pip2nix` to generate the Nix derivations for our Python
20 dependencies.
21
22 Generating the dependencies should be done with the following command:
23
24 .. code:: shell
25
26 pip2nix generate --license
27
28
29 .. note::
30
31 License extraction support is still experimental, use the version from the
32 following pull request: https://github.com/ktosiek/pip2nix/pull/30
33
34
35
36 Node dependencies
37 =================
38
39 After adding new dependencies via ``npm install --save``, use `node2nix` to
40 update the corresponding Nix derivations:
41
42 .. code:: shell
43
44 cd pkgs
45 node2nix --input ../package.json \
46 -o node-packages.nix \
47 -e node-env.nix \
48 -c node-default.nix \
49 -d --flatten
50
51
52 Bower dependencies
53 ==================
54
55 Frontend dependencies are managed based on `bower`, with `bower2nix` a tool
56 exists which can generate the needed Nix derivations:
57
58 .. code:: shell
59
60 bower2nix bower.json pkgs/bower-packages.nix
16 Please check pkgs/README.rst file for mor information on how to build the packages.
@@ -14,12 +14,23 b' so to clarify what is meant each time, r'
14 14 between software components and can be used to trigger plugins, or their
15 15 extensions.
16 16
17 .. toctree::
17
18 Hooks
19 -----
20
21 Within |RCM| there are two types of supported hooks.
18 22
19 rcx
20 install-ext
21 config-ext
22 extensions
23 hooks
24 full-blown-example
25 int-slack
23 * **Internal built-in hooks**: The internal |hg|, |git| or |svn| hooks are
24 triggered by different VCS operations, like push, pull,
25 or clone and are non-configurable, but you can add your own VCS hooks,
26 see :ref:`custom-hooks`.
27 * **Custom rcextensions hooks**: User defined hooks centre around the lifecycle of
28 certain actions such are |repo| creation, user creation etc. The actions
29 these hooks trigger can be rejected based on the API permissions of the
30 user calling them.
31
32 On instructions how to use the custom `rcextensions`
33 see :ref:`integrations-rcextensions` section.
34
35
36
@@ -19,9 +19,7 b' Once configured you can check the settin'
19 19 ## Additionally these settings will be used by the RhodeCode mailing system ##
20 20 ################################################################################
21 21 #email_to = admin@localhost
22 #error_email_from = paste_error@localhost
23 22 #app_email_from = rhodecode-noreply@localhost
24 #error_message =
25 23 #email_prefix = [RhodeCode]
26 24
27 25 #smtp_server = mail.server.com
@@ -30,5 +28,3 b' Once configured you can check the settin'
30 28 #smtp_port =
31 29 #smtp_use_tls = false
32 30 #smtp_use_ssl = true
33 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
34 #smtp_auth =
@@ -3,7 +3,7 b''
3 3 Integrations
4 4 ------------
5 5
6 Rhodecode supports integrations with external services for various events,
6 |RCE| supports integrations with external services for various events,
7 7 such as commit pushes and pull requests. Multiple integrations of the same type
8 8 can be added at the same time; this is useful for posting different events to
9 9 different Slack channels, for example.
@@ -11,18 +11,20 b' different Slack channels, for example.'
11 11 Supported integrations
12 12 ^^^^^^^^^^^^^^^^^^^^^^
13 13
14 ============================ ============ =====================================
15 Type/Name |RC| Edition Description
16 ============================ ============ =====================================
17 :ref:`integrations-slack` |RCCEshort| https://slack.com/
18 :ref:`integrations-hipchat` |RCCEshort| https://www.hipchat.com/
19 :ref:`integrations-webhook` |RCCEshort| POST events as `json` to a custom url
20 :ref:`integrations-ci` |RCCEshort| Trigger Builds for Common CI Systems
21 :ref:`integrations-email` |RCCEshort| Send repo push commits by email
22 :ref:`integrations-jenkins` |RCEEshort| Trigger Builds for Jenkins CI System
23 :ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference Redmine issues
24 :ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues
25 ============================ ============ =====================================
14 ================================ ============ ========================================
15 Type/Name |RC| Edition Description
16 ================================ ============ ========================================
17 :ref:`integrations-webhook` |RCCEshort| Trigger events as `json` to a custom url
18 :ref:`integrations-slack` |RCCEshort| Integrate with https://slack.com/
19 :ref:`integrations-hipchat` |RCCEshort| Integrate with https://www.hipchat.com/
20 :ref:`integrations-email` |RCCEshort| Send repo push commits by email
21 :ref:`integrations-ci` |RCCEshort| Trigger Builds for Common CI Systems
22 :ref:`integrations-rcextensions` |RCCEshort| Advanced low-level integration framework
23
24 :ref:`integrations-jenkins` |RCEEshort| Trigger Builds for Jenkins CI System
25 :ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference Redmine issues
26 :ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues
27 ================================ ============ ========================================
26 28
27 29 .. _creating-integrations:
28 30
@@ -55,3 +57,4 b' See pages specific to each type of integ'
55 57 email
56 58 ci
57 59 jenkins
60 integrations-rcextensions
@@ -9,6 +9,7 b' Release Notes'
9 9 .. toctree::
10 10 :maxdepth: 1
11 11
12 release-notes-4.14.0.rst
12 13 release-notes-4.13.3.rst
13 14 release-notes-4.13.2.rst
14 15 release-notes-4.13.1.rst
@@ -1,13 +1,13 b''
1 1 .menuselection, .guilabel {
2 2 font-size: .90em;
3 font-family: "proximanovaregular", "Proxima Nova Regular", "Proxima Nova", sans-serif;
3 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
4 4 font-style: oblique;
5 5 }
6 6
7 .version{
7 .version {
8 8 display: none;
9 }
9 }
10 10
11 .pre{
12 color:#000
13 }
11 .pre {
12 color: #000
13 }
@@ -273,107 +273,8 b' Use this to create or update a |RCE| con'
273 273 rhodecode-extensions
274 274 --------------------
275 275
276 |RCT| adds additional mapping for :ref:`indexing-ref`, statistics, and adds
277 additional code for push/pull/create/delete |repo| hooks. These hooks can be
278 used to send signals to build-bots such as jenkins. Options:
279
280 .. rst-class:: dl-horizontal
281
282 \-c, - -config <config_file>
283 Create a configuration file. The default file is created
284 in ``~/.rhoderc``
285
286 \-h, - -help
287 Show help messages.
288
289 \-F, - -format {json,pretty}
290 Set the formatted representation.
291
292 \-I, - -install-dir <str>
293 Set the location of the |RCE| installation. The default location is
294 :file:`/home/{user}/.rccontrol/`.
295
296 \ - -ini-file <str>
297 Path to the :file:`rhodecode.ini` file for that instance.
298
299 \ - -instance-name <instance-id>
300 Set the instance name.
301
302 \ - -plugins
303 Add plugins to your |RCE| installation. See the
304 :ref:`extensions-hooks-ref` section for more details.
305
306 \ - -version
307 Display your |RCT| version.
308
309
310 Once installed, you will see a :file:`rcextensions` folder in the instance
311 directory, for example :file:`home/{user}/.rccontrol/{instance-id}/rcextensions`
312
313 To install ``rcextensions``, use the following example:
314
315 .. code-block:: bash
316
317 # install extensions on the given instance
318 # If using virtualenv prior to RCE 350
319 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
320 --ini-file=rhodecode.ini
321 Writen new extensions file to rcextensions
322
323 # install extensions with additional plugins on the given instance
324 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
325 --ini-file=rhodecode.ini --plugins
326 Writen new extensions file to rcextensions
327
328 # installing extensions from 350 onwards
329 # as they are packaged with RCE
330 $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \
331 --instance-name=enterprise-4 --ini-file=rhodecode.ini
332
333 Writen new extensions file to rcextensions
334
335 See the new extensions inside this directory for more details about the
336 additional hooks available, for example see the ``push_post.py`` file.
337
338 .. code-block:: python
339
340 import urllib
341 import urllib2
342
343 def run(*args, **kwargs):
344 """
345 Extra params
346
347 :param URL: url to send the data to
348 """
349
350 url = kwargs.pop('URL', None)
351 if url:
352 from rhodecode.lib.compat import json
353 from rhodecode.model.db import Repository
354
355 repo = Repository.get_by_repo_name(kwargs['repository'])
356 changesets = []
357 vcs_repo = repo.scm_instance_no_cache()
358 for r in kwargs['pushed_revs']:
359 cs = vcs_repo.get_changeset(r)
360 changesets.append(json.dumps(cs))
361
362 kwargs['pushed_revs'] = changesets
363 headers = {
364 'User-Agent': 'RhodeCode-SCM web hook',
365 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
366 'Accept': 'text/javascript, text/html, application/xml, '
367 'text/xml, */*',
368 'Accept-Encoding': 'gzip,deflate,sdch',
369 }
370
371 data = kwargs
372 data = urllib.urlencode(data)
373 req = urllib2.Request(url, data, headers)
374 response = urllib2.urlopen(req)
375 response.read()
376 return 0
276 The `rcextensions` since version 4.14 are now shipped together with |RCE| please check
277 the using :ref:`integrations-rcextensions` section.
377 278
378 279
379 280 rhodecode-gist
@@ -54,23 +54,13 b' packaged with |RCE| by default.'
54 54
55 55 .. code-block:: bash
56 56
57 $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \
58 --instance-name=enterprise-4 --ini-file=rhodecode.ini
57 $ .rccontrol/enterprise-4/profile/bin/rhodecode-api --instance-name=enterprise-4 get_ip [11:56:57 on 05/10/2018]
59 58
60 Writen new extensions file to rcextensions
61 Copied hipchat_push_notify.py plugin to rcextensions
62 Copied jira_pr_flow.py plugin to rcextensions
63 Copied default_reviewers.py plugin to rcextensions
64 Copied extract_commits.py plugin to rcextensions
65 Copied extract_issues.py plugin to rcextensions
66 Copied redmine_pr_flow.py plugin to rcextensions
67 Copied extra_fields.py plugin to rcextensions
68 Copied jira_smart_commits.py plugin to rcextensions
69 Copied http_notify.py plugin to rcextensions
70 Copied slack_push_notify.py plugin to rcextensions
71 Copied slack_message.py plugin to rcextensions
72 Copied extract_jira_issues.py plugin to rcextensions
73 Copied extract_redmine_issues.py plugin to rcextensions
74 Copied redmine_smart_commits.py plugin to rcextensions
75 Copied send_mail.py plugin to rcextensions
76
59 {
60 "error": null,
61 "id": 1000,
62 "result": {
63 "server_ip_addr": "1.2.3.4",
64 "user_ips": []
65 }
66 }
@@ -1,35 +1,33 b''
1 1 {
2 2 "dirs": {
3 3 "css": {
4 "src":"rhodecode/public/css",
5 "dest":"rhodecode/public/css"
4 "src": "rhodecode/public/css",
5 "dest": "rhodecode/public/css"
6 6 },
7 7 "js": {
8 8 "src": "rhodecode/public/js/src",
9 9 "src_rc": "rhodecode/public/js/rhodecode",
10 10 "dest": "rhodecode/public/js",
11 "bower": "bower_components",
12 11 "node_modules": "node_modules"
13 12 }
14 13 },
15 14 "copy": {
16 15 "main": {
17 "expand": true,
18 "cwd": "bower_components",
19 "src": "webcomponentsjs/webcomponents-lite.js",
20 "dest": "<%= dirs.js.dest %>/vendors"
16 "files": [
17 {
18 "expand": true,
19 "cwd": "node_modules/@webcomponents",
20 "src": "webcomponentsjs/*.*",
21 "dest": "<%= dirs.js.dest %>/vendors"
22 },
23 {
24 "src": "<%= dirs.css.src %>/style-polymer.css",
25 "dest": "<%= dirs.js.dest %>/src/components/style-polymer.css"
26 }
27 ]
21 28 }
22 29 },
23 30 "concat": {
24 "polymercss": {
25 "src": [
26 "<%= dirs.js.src %>/components/root-styles-prefix.html",
27 "<%= dirs.css.src %>/style-polymer.css",
28 "<%= dirs.js.src %>/components/root-styles-suffix.html"
29 ],
30 "dest": "<%= dirs.js.dest %>/src/components/root-styles.gen.html",
31 "nonull": true
32 },
33 31 "dist": {
34 32 "src": [
35 33 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
@@ -37,6 +35,10 b''
37 35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
38 36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
39 37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
38 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
39 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
40 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
41 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
40 42 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
41 43 "<%= dirs.js.src %>/logging.js",
42 44 "<%= dirs.js.src %>/bootstrap.js",
@@ -89,22 +91,13 b''
89 91 "<%= dirs.js.src %>/rhodecode/tooltips.js",
90 92 "<%= dirs.js.src %>/rhodecode/users.js",
91 93 "<%= dirs.js.src %>/rhodecode/appenlight.js",
92 "<%= dirs.js.src %>/rhodecode.js"
94 "<%= dirs.js.src %>/rhodecode.js",
95 "<%= dirs.js.dest %>/rhodecode-components.js"
93 96 ],
94 97 "dest": "<%= dirs.js.dest %>/scripts.js",
95 98 "nonull": true
96 99 }
97 100 },
98 "crisper": {
99 "dist": {
100 "options": {
101 "cleanup": false,
102 "onlySplit": true
103 },
104 "src": "<%= dirs.js.dest %>/rhodecode-components.html",
105 "dest": "<%= dirs.js.dest %>/rhodecode-components.js"
106 }
107 },
108 101 "less": {
109 102 "development": {
110 103 "options": {
@@ -152,8 +145,7 b''
152 145 "less:development",
153 146 "less:components",
154 147 "concat:polymercss",
155 "vulcanize",
156 "crisper",
148 "webpack",
157 149 "concat:dist"
158 150 ]
159 151 },
@@ -166,8 +158,7 b''
166 158 "tasks": [
167 159 "less:components",
168 160 "concat:polymercss",
169 "vulcanize",
170 "crisper",
161 "webpack",
171 162 "concat:dist"
172 163 ]
173 164 }
@@ -179,18 +170,5 b''
179 170 "jshintrc": ".jshintrc"
180 171 }
181 172 }
182 },
183 "vulcanize": {
184 "default": {
185 "options": {
186 "abspath": "",
187 "inlineScripts": true,
188 "inlineCss": true,
189 "stripComments": true
190 },
191 "files": {
192 "<%= dirs.js.dest %>/rhodecode-components.html": "<%= dirs.js.src %>/components/shared-components.html"
193 }
194 }
195 173 }
196 174 }
@@ -1,6 +1,6 b''
1 1 {
2 2 "name": "rhodecode-enterprise",
3 "version": "1.0.0",
3 "version": "2.0.0",
4 4 "private": true,
5 5 "description" : "RhodeCode JS packaged",
6 6 "license": "SEE LICENSE IN LICENSE.txt",
@@ -9,25 +9,50 b''
9 9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 10 },
11 11 "devDependencies": {
12 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1",
13 "clipboard": "^2.0.1",
14 "exports-loader": "^0.6.4",
15 "favico.js": "^0.3.10",
12 16 "grunt": "^0.4.5",
17 "grunt-cli": "^1.3.1",
18 "grunt-contrib-concat": "^0.5.1",
13 19 "grunt-contrib-copy": "^1.0.0",
14 "grunt-contrib-concat": "^0.5.1",
15 20 "grunt-contrib-jshint": "^0.12.0",
16 21 "grunt-contrib-less": "^1.1.0",
17 22 "grunt-contrib-watch": "^0.6.1",
18 "crisper": "^2.1.1",
19 "vulcanize": "^1.16.0",
20 "grunt-crisper": "^1.0.1",
21 "grunt-vulcanize": "^1.0.0",
22 "node2nix": "^1.0.0",
23 "grunt-webpack": "^3.1.3",
24 "jquery": "1.11.3",
23 25 "jshint": "^2.9.1-rc3",
24 "bower": "^1.8.4",
25 "jquery": "1.11.3",
26 "favico.js": "^0.3.10",
27 "clipboard": "^2.0.1",
28 "qrious": "^4.0.2",
29 26 "moment": "^2.18.1",
30 27 "mousetrap": "^1.6.1",
31 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
28 "qrious": "^4.0.2",
29 "sticky-sidebar": "3.3.1",
30 "waypoints": "4.0.1",
31 "webpack": "4.23.1",
32 "webpack-cli": "3.1.2",
33 "babel-core": "^6.26.3",
34 "babel-loader": "^7.1.2",
35 "babel-plugin-transform-object-rest-spread": "^6.26.0",
36 "babel-preset-env": "^1.6.0",
37 "copy-webpack-plugin": "^4.4.2",
38 "css-loader": "^0.28.11",
39 "html-loader": "^0.4.4",
40 "html-webpack-plugin": "^3.2.0",
41 "imports-loader": "^0.7.1",
42 "polymer-webpack-loader": "^2.0.1",
43 "style-loader": "^0.21.0",
44 "webpack-uglify-js-plugin": "^1.1.9",
45 "raw-loader": "1.0.0-beta.0",
46 "ts-loader": "^1.3.3",
47 "@webcomponents/webcomponentsjs": "^2.0.0",
48 "@polymer/polymer": "^3.0.0",
49 "@polymer/paper-button": "^3.0.0",
50 "@polymer/paper-spinner": "^3.0.0",
51 "@polymer/paper-tooltip": "^3.0.0",
52 "@polymer/paper-toast": "^3.0.0",
53 "@polymer/paper-toggle-button": "^3.0.0",
54 "@polymer/iron-ajax": "^3.0.0",
55 "@polymer/iron-autogrow-textarea": "^3.0.0",
56 "@polymer/iron-a11y-keys": "^3.0.0"
32 57 }
33 58 }
@@ -27,24 +27,29 b' Python dependencies'
27 27 NodeJS dependencies
28 28 ===================
29 29
30 Generate node-packages.nix file with all dependencies from NPM and package.json file
31 This should be run before entering nix-shell.
32
33 The sed at the end fixes a bug with http rewrite of re-generated packages
34
30 35 .. code:: shell
31 36
32 rm -rf node_modules
37 rm -rf node_modules &&
33 38 nix-shell pkgs/shell-generate.nix --command "
34 39 node2nix --input package.json \
35 40 -o pkgs/node-packages.nix \
36 41 -e pkgs/node-env.nix \
37 42 -c pkgs/node-default.nix \
38 -d --flatten --nodejs-6 "
43 -d --flatten --nodejs-8 " &&
44 sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix
39 45
40 46
41
42 Bower dependencies
43 ==================
47 Generate license data
48 =====================
44 49
45 50 .. code:: shell
46 51
47 nix-shell pkgs/shell-generate.nix --command "bower2nix bower.json pkgs/bower-packages.nix"
52 nix-build pkgs/license-generate.nix -o result-license && cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json
48 53
49 54
50 55 .. Links
@@ -2,9 +2,9 b''
2 2 #
3 3 # Usage:
4 4 #
5 # nix-build -I ~/dev license.nix -A result
5 # nix-build license.nix -o result-license
6 6 #
7 # Afterwards ./result will contain the license information as JSON files.
7 # Afterwards ./result-license will contain the license information as JSON files.
8 8 #
9 9 #
10 10 # Overview
@@ -19,7 +19,7 b''
19 19 # dependencies. The results from step 1 are then limited to the ones which
20 20 # are in this list.
21 21 #
22 # The result is then available in ./result/license.json.
22 # The result is then available in ./result-license/license.json.
23 23 #
24 24
25 25
@@ -32,20 +32,20 b' let'
32 32 # Enterprise as simple as possible, goal here is just to identify the runtime
33 33 # dependencies. Ideally we could avoid building Enterprise at all and somehow
34 34 # figure it out without calling into nix-store.
35 enterprise = import ./default.nix {
35 enterprise = import ../default.nix {
36 36 doCheck = false;
37 37 };
38 38
39 39 # For a given derivation, return the list of all dependencies
40 40 drvToDependencies = drv: nixpkgs.lib.flatten [
41 drv.nativeBuildInputs or []
42 drv.propagatedNativeBuildInputs or []
41 drv.buildInputs or []
42 drv.propagatedBuildInputs or []
43 43 ];
44 44
45 45 # Transform the given derivation into the meta information which we need in
46 46 # the resulting JSON files.
47 47 drvToMeta = drv: {
48 name = drv.name or "UNNAMED";
48 name = drv.name or drv;
49 49 license = if drv ? meta.license then drv.meta.license else "UNKNOWN";
50 50 };
51 51
@@ -70,10 +70,8 b' let'
70 70 rawStorePaths = nixpkgs.lib.removeSuffix "\n" (
71 71 builtins.readFile srcPath);
72 72 storePaths = nixpkgs.lib.splitString "\n" rawStorePaths;
73 # TODO: johbo: Would be nice to use some sort of utility here to convert
74 # the path to a derivation name.
75 73 storePathPrefix = (
76 builtins.stringLength "/nix/store/zwy7aavnif9ayw30rya1k6xiacafzzl6-");
74 builtins.stringLength "/nix/store/afafafafafafafafafafafafafafafaf-");
77 75 storePathToName = path:
78 76 builtins.substring storePathPrefix (builtins.stringLength path) path;
79 77 in (map storePathToName storePaths);
@@ -147,6 +145,7 b' in rec {'
147 145 cat > build/licenses.json <<EOF
148 146 ${builtins.toJSON enterpriseRuntimeLicenses}
149 147 EOF
148
150 149 '';
151 150
152 151 installPhase = ''
@@ -2,7 +2,7 b''
2 2
3 3 {pkgs ? import <nixpkgs> {
4 4 inherit system;
5 }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-6_x"}:
5 }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-8_x"}:
6 6
7 7 let
8 8 nodeEnv = import ./node-env.nix {
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from pkgs/patch_beaker/patch-beaker-lock-func-debug.diff to pkgs/patches/beaker/patch-beaker-lock-func-debug.diff
1 NO CONTENT: file renamed from pkgs/patch_beaker/patch-beaker-metadata-reuse.diff to pkgs/patches/beaker/patch-beaker-metadata-reuse.diff
@@ -30,8 +30,8 b' self: super: {'
30 30
31 31 "beaker" = super."beaker".override (attrs: {
32 32 patches = [
33 ./patch_beaker/patch-beaker-lock-func-debug.diff
34 ./patch_beaker/patch-beaker-metadata-reuse.diff
33 ./patches/beaker/patch-beaker-lock-func-debug.diff
34 ./patches/beaker/patch-beaker-metadata-reuse.diff
35 35 ];
36 36 });
37 37
@@ -240,6 +240,12 b' self: super: {'
240 240 };
241 241 });
242 242
243 "supervisor" = super."supervisor".override (attrs: {
244 patches = [
245 ./patches/supervisor/patch-rlimits-old-kernel.diff
246 ];
247 });
248
243 249 # Avoid that base packages screw up the build process
244 250 inherit (basePythonPackages)
245 251 setuptools;
@@ -52,22 +52,22 b' self: super: {'
52 52 };
53 53 };
54 54 "atomicwrites" = super.buildPythonPackage {
55 name = "atomicwrites-1.1.5";
55 name = "atomicwrites-1.2.1";
56 56 doCheck = false;
57 57 src = fetchurl {
58 url = "https://files.pythonhosted.org/packages/a1/e1/2d9bc76838e6e6667fde5814aa25d7feb93d6fa471bf6816daac2596e8b2/atomicwrites-1.1.5.tar.gz";
59 sha256 = "11bm90fwm2avvf4f3ib8g925w7jr4m11vcsinn1bi6ns4bm32214";
58 url = "https://files.pythonhosted.org/packages/ac/ed/a311712ef6b4355035489f665e63e1a73f9eb371929e3c98e5efd451069e/atomicwrites-1.2.1.tar.gz";
59 sha256 = "1vmkbw9j0qammwxbxycrs39gvdg4lc2d4lk98kwf8ag2manyi6pc";
60 60 };
61 61 meta = {
62 62 license = [ pkgs.lib.licenses.mit ];
63 63 };
64 64 };
65 65 "attrs" = super.buildPythonPackage {
66 name = "attrs-18.1.0";
66 name = "attrs-18.2.0";
67 67 doCheck = false;
68 68 src = fetchurl {
69 url = "https://files.pythonhosted.org/packages/e4/ac/a04671e118b57bee87dabca1e0f2d3bda816b7a551036012d0ca24190e71/attrs-18.1.0.tar.gz";
70 sha256 = "0yzqz8wv3w1srav5683a55v49i0szkm47dyrnkd56fqs8j8ypl70";
69 url = "https://files.pythonhosted.org/packages/0f/9e/26b1d194aab960063b266170e53c39f73ea0d0d3f5ce23313e0ec8ee9bdf/attrs-18.2.0.tar.gz";
70 sha256 = "0s9ydh058wmmf5v391pym877x4ahxg45dw6a0w4c7s5wgpigdjqh";
71 71 };
72 72 meta = {
73 73 license = [ pkgs.lib.licenses.mit ];
@@ -160,17 +160,6 b' self: super: {'
160 160 license = [ pkgs.lib.licenses.asl20 ];
161 161 };
162 162 };
163 "bottle" = super.buildPythonPackage {
164 name = "bottle-0.12.13";
165 doCheck = false;
166 src = fetchurl {
167 url = "https://files.pythonhosted.org/packages/bd/99/04dc59ced52a8261ee0f965a8968717a255ea84a36013e527944dbf3468c/bottle-0.12.13.tar.gz";
168 sha256 = "0m9k2a7yxvggc4kw8fsvj381vgsvfcdshg5nzy6vwrxiw2p53drr";
169 };
170 meta = {
171 license = [ pkgs.lib.licenses.mit ];
172 };
173 };
174 163 "bumpversion" = super.buildPythonPackage {
175 164 name = "bumpversion-0.5.3";
176 165 doCheck = false;
@@ -295,28 +284,14 b' self: super: {'
295 284 };
296 285 };
297 286 "coverage" = super.buildPythonPackage {
298 name = "coverage-3.7.1";
287 name = "coverage-4.5.1";
299 288 doCheck = false;
300 289 src = fetchurl {
301 url = "https://files.pythonhosted.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
302 sha256 = "0knlbq79g2ww6xzsyknj9rirrgrgc983dpa2d9nkdf31mb2a3bni";
290 url = "https://files.pythonhosted.org/packages/35/fe/e7df7289d717426093c68d156e0fd9117c8f4872b6588e8a8928a0f68424/coverage-4.5.1.tar.gz";
291 sha256 = "1wbrzpxka3xd4nmmkc6q0ir343d91kymwsm8pbmwa0d2a7q4ir2n";
303 292 };
304 293 meta = {
305 license = [ pkgs.lib.licenses.bsdOriginal ];
306 };
307 };
308 "cprofilev" = super.buildPythonPackage {
309 name = "cprofilev-1.0.7";
310 doCheck = false;
311 propagatedBuildInputs = [
312 self."bottle"
313 ];
314 src = fetchurl {
315 url = "https://files.pythonhosted.org/packages/df/50/d8c1ada7d537c64b0f76453fa31dedb6af6e27b82fcf0331e5f71a4cf98b/CProfileV-1.0.7.tar.gz";
316 sha256 = "0xwszfhxgndpcjkpq89dix6vi02hj1gzvhr7r716hd1x3y5p94c7";
317 };
318 meta = {
319 license = [ pkgs.lib.licenses.mit ];
294 license = [ pkgs.lib.licenses.asl20 ];
320 295 };
321 296 };
322 297 "cssselect" = super.buildPythonPackage {
@@ -372,11 +347,11 b' self: super: {'
372 347 };
373 348 };
374 349 "dogpile.cache" = super.buildPythonPackage {
375 name = "dogpile.cache-0.6.6";
350 name = "dogpile.cache-0.6.7";
376 351 doCheck = false;
377 352 src = fetchurl {
378 url = "https://files.pythonhosted.org/packages/48/ca/604154d835c3668efb8a31bd979b0ea4bf39c2934a40ffecc0662296cb51/dogpile.cache-0.6.6.tar.gz";
379 sha256 = "1h8n1lxd4l2qvahfkiinljkqz7pww7w3sgag0j8j9ixbl2h4wk84";
353 url = "https://files.pythonhosted.org/packages/ee/bd/440da735a11c6087eed7cc8747fc4b995cbac2464168682f8ee1c8e43844/dogpile.cache-0.6.7.tar.gz";
354 sha256 = "1aw8rx8vhb75y7zc6gi67g21sw057jdx7i8m3jq7kf3nqavxx9zw";
380 355 };
381 356 meta = {
382 357 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -515,14 +490,14 b' self: super: {'
515 490 };
516 491 };
517 492 "gevent" = super.buildPythonPackage {
518 name = "gevent-1.3.5";
493 name = "gevent-1.3.6";
519 494 doCheck = false;
520 495 propagatedBuildInputs = [
521 496 self."greenlet"
522 497 ];
523 498 src = fetchurl {
524 url = "https://files.pythonhosted.org/packages/e6/0a/fc345c6e6161f84484870dbcaa58e427c10bd9bdcd08a69bed3d6b398bf1/gevent-1.3.5.tar.gz";
525 sha256 = "1w3gydxirgd2f60c5yv579w4903ds9s4g3587ik4jby97hgqc5bz";
499 url = "https://files.pythonhosted.org/packages/49/13/aa4bb3640b5167fe58875d3d7e65390cdb14f9682a41a741a566bb560842/gevent-1.3.6.tar.gz";
500 sha256 = "1ih4k73dqz2zb561hda99vbanja3m6cdch3mgxxn1mla3qwkqhbv";
526 501 };
527 502 meta = {
528 503 license = [ pkgs.lib.licenses.mit ];
@@ -550,23 +525,12 b' self: super: {'
550 525 license = [ { fullName = "GNU Lesser General Public License v3 or later (LGPLv3+)"; } { fullName = "LGPL"; } ];
551 526 };
552 527 };
553 "graphviz" = super.buildPythonPackage {
554 name = "graphviz-0.9";
528 "greenlet" = super.buildPythonPackage {
529 name = "greenlet-0.4.15";
555 530 doCheck = false;
556 531 src = fetchurl {
557 url = "https://files.pythonhosted.org/packages/2b/e6/71521bab8fb99833133f08f6ac0460e2f6b425a7f75ac4b02323c3c3b512/graphviz-0.9.zip";
558 sha256 = "14r9brj4r31b3qy1nnn34v3l4h0n39bqxg9sn2fz4p3pp5mglnl6";
559 };
560 meta = {
561 license = [ pkgs.lib.licenses.mit ];
562 };
563 };
564 "greenlet" = super.buildPythonPackage {
565 name = "greenlet-0.4.13";
566 doCheck = false;
567 src = fetchurl {
568 url = "https://files.pythonhosted.org/packages/13/de/ba92335e9e76040ca7274224942282a80d54f85e342a5e33c5277c7f87eb/greenlet-0.4.13.tar.gz";
569 sha256 = "1r412gfx25jrdiv444prmz5a8igrfabwnwqyr6b52ypq7ga87vqg";
532 url = "https://files.pythonhosted.org/packages/f8/e8/b30ae23b45f69aa3f024b46064c0ac8e5fcb4f22ace0dca8d6f9c8bbe5e7/greenlet-0.4.15.tar.gz";
533 sha256 = "1g4g1wwc472ds89zmqlpyan3fbnzpa8qm48z3z1y6mlk44z485ll";
570 534 };
571 535 meta = {
572 536 license = [ pkgs.lib.licenses.mit ];
@@ -599,11 +563,11 b' self: super: {'
599 563 };
600 564 };
601 565 "hupper" = super.buildPythonPackage {
602 name = "hupper-1.3";
566 name = "hupper-1.3.1";
603 567 doCheck = false;
604 568 src = fetchurl {
605 url = "https://files.pythonhosted.org/packages/51/0c/96335b1f2f32245fb871eea5bb9773196505ddb71fad15190056a282df9e/hupper-1.3.tar.gz";
606 sha256 = "1pkyrm9c2crc32ps00k1ahnc5clj3pjwiarc7j0x8aykwih7ff10";
569 url = "https://files.pythonhosted.org/packages/cf/4b/467b826a84c8594b81f414b5ab6794e981951dac90ca40abaf9ea1cb36b0/hupper-1.3.1.tar.gz";
570 sha256 = "03mf13n6i4dd60wlb9m99ddl4m3lmly70cjp7f82vdkibfl1v6l9";
607 571 };
608 572 meta = {
609 573 license = [ pkgs.lib.licenses.mit ];
@@ -850,11 +814,11 b' self: super: {'
850 814 };
851 815 };
852 816 "mistune" = super.buildPythonPackage {
853 name = "mistune-0.8.3";
817 name = "mistune-0.8.4";
854 818 doCheck = false;
855 819 src = fetchurl {
856 url = "https://files.pythonhosted.org/packages/9d/be/e06d4346cc608a01dec6bf770d7d0303a4fd6db588b318ced18f5f257145/mistune-0.8.3.tar.gz";
857 sha256 = "06b662p6kf46wh2jsabaqhaq4bz1srh2zxkrnx4yg96azlxw645w";
820 url = "https://files.pythonhosted.org/packages/2d/a4/509f6e7783ddd35482feda27bc7f72e65b5e7dc910eca4ab2164daf9c577/mistune-0.8.4.tar.gz";
821 sha256 = "0vkmsh0x480rni51lhyvigfdf06b9247z868pk3bal1wnnfl58sr";
858 822 };
859 823 meta = {
860 824 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -947,20 +911,6 b' self: super: {'
947 911 license = [ pkgs.lib.licenses.bsdOriginal ];
948 912 };
949 913 };
950 "objgraph" = super.buildPythonPackage {
951 name = "objgraph-3.1.1";
952 doCheck = false;
953 propagatedBuildInputs = [
954 self."graphviz"
955 ];
956 src = fetchurl {
957 url = "https://files.pythonhosted.org/packages/be/58/9ca81a20cc837054e94866df1475d899caaa94f3732b8a46006858b015f7/objgraph-3.1.1.tar.gz";
958 sha256 = "17aq4cwainiwvj8x61j0hx45c313bkwza5fijnmmw8v8glyy2bcc";
959 };
960 meta = {
961 license = [ pkgs.lib.licenses.mit ];
962 };
963 };
964 914 "packaging" = super.buildPythonPackage {
965 915 name = "packaging-15.2";
966 916 doCheck = false;
@@ -1025,15 +975,15 b' self: super: {'
1025 975 };
1026 976 };
1027 977 "pathlib2" = super.buildPythonPackage {
1028 name = "pathlib2-2.3.0";
978 name = "pathlib2-2.3.2";
1029 979 doCheck = false;
1030 980 propagatedBuildInputs = [
1031 981 self."six"
1032 982 self."scandir"
1033 983 ];
1034 984 src = fetchurl {
1035 url = "https://files.pythonhosted.org/packages/a1/14/df0deb867c2733f7d857523c10942b3d6612a1b222502fdffa9439943dfb/pathlib2-2.3.0.tar.gz";
1036 sha256 = "1cx5gs2v9j2vnzmcrbq5l8fq2mwrr1h6pyf1sjdji2w1bavm09fk";
985 url = "https://files.pythonhosted.org/packages/db/a8/7d6439c1aec525ed70810abee5b7d7f3aa35347f59bc28343e8f62019aa2/pathlib2-2.3.2.tar.gz";
986 sha256 = "10yb0iv5x2hs631rcppkhbddx799d3h8pcwmkbh2a66ns3w71ccf";
1037 987 };
1038 988 meta = {
1039 989 license = [ pkgs.lib.licenses.mit ];
@@ -1065,14 +1015,14 b' self: super: {'
1065 1015 };
1066 1016 };
1067 1017 "pickleshare" = super.buildPythonPackage {
1068 name = "pickleshare-0.7.4";
1018 name = "pickleshare-0.7.5";
1069 1019 doCheck = false;
1070 1020 propagatedBuildInputs = [
1071 1021 self."pathlib2"
1072 1022 ];
1073 1023 src = fetchurl {
1074 url = "https://files.pythonhosted.org/packages/69/fe/dd137d84daa0fd13a709e448138e310d9ea93070620c9db5454e234af525/pickleshare-0.7.4.tar.gz";
1075 sha256 = "0yvk14dzxk7g6qpr7iw23vzqbsr0dh4ij4xynkhnzpfz4xr2bac4";
1024 url = "https://files.pythonhosted.org/packages/d8/b6/df3c1c9b616e9c0edbc4fbab6ddd09df9535849c64ba51fcb6531c32d4d8/pickleshare-0.7.5.tar.gz";
1025 sha256 = "1jmghg3c53yp1i8cm6pcrm280ayi8621rwyav9fac7awjr3kss47";
1076 1026 };
1077 1027 meta = {
1078 1028 license = [ pkgs.lib.licenses.mit ];
@@ -1108,11 +1058,11 b' self: super: {'
1108 1058 };
1109 1059 };
1110 1060 "pluggy" = super.buildPythonPackage {
1111 name = "pluggy-0.6.0";
1061 name = "pluggy-0.8.0";
1112 1062 doCheck = false;
1113 1063 src = fetchurl {
1114 url = "https://files.pythonhosted.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz";
1115 sha256 = "1zqckndfn85l1cd8pndw212zg1bq9fkg1nnj32kp2mppppsyg2kz";
1064 url = "https://files.pythonhosted.org/packages/65/25/81d0de17cd00f8ca994a4e74e3c4baf7cd25072c0b831dad5c7d9d6138f8/pluggy-0.8.0.tar.gz";
1065 sha256 = "1580p47l2zqzsza8jcnw1h2wh3vvmygk6ly8bvi4w0g8j14sjys4";
1116 1066 };
1117 1067 meta = {
1118 1068 license = [ pkgs.lib.licenses.mit ];
@@ -1134,22 +1084,22 b' self: super: {'
1134 1084 };
1135 1085 };
1136 1086 "psutil" = super.buildPythonPackage {
1137 name = "psutil-5.4.6";
1087 name = "psutil-5.4.7";
1138 1088 doCheck = false;
1139 1089 src = fetchurl {
1140 url = "https://files.pythonhosted.org/packages/51/9e/0f8f5423ce28c9109807024f7bdde776ed0b1161de20b408875de7e030c3/psutil-5.4.6.tar.gz";
1141 sha256 = "1xmw4qi6hnrhw81xqzkvmsm9im7j2vkk4v26ycjwq2jczqsmlvk8";
1090 url = "https://files.pythonhosted.org/packages/7d/9a/1e93d41708f8ed2b564395edfa3389f0fd6d567597401c2e5e2775118d8b/psutil-5.4.7.tar.gz";
1091 sha256 = "0fsgmvzwbdbszkwfnqhib8jcxm4w6zyhvlxlcda0rfm5cyqj4qsv";
1142 1092 };
1143 1093 meta = {
1144 1094 license = [ pkgs.lib.licenses.bsdOriginal ];
1145 1095 };
1146 1096 };
1147 1097 "psycopg2" = super.buildPythonPackage {
1148 name = "psycopg2-2.7.4";
1098 name = "psycopg2-2.7.5";
1149 1099 doCheck = false;
1150 1100 src = fetchurl {
1151 url = "https://files.pythonhosted.org/packages/74/83/51580322ed0e82cba7ad8e0af590b8fb2cf11bd5aaa1ed872661bd36f462/psycopg2-2.7.4.tar.gz";
1152 sha256 = "02b2yaf1hlwb91xkscbzmajpfj5z3d8yikzh5r48fs8gss8i3xcb";
1101 url = "https://files.pythonhosted.org/packages/b2/c1/7bf6c464e903ffc4f3f5907c389e5a4199666bf57f6cd6bf46c17912a1f9/psycopg2-2.7.5.tar.gz";
1102 sha256 = "17klx964gw8z0znl0raz3by8vdc7cq5gxj4pdcrfcina84nrdkzc";
1153 1103 };
1154 1104 meta = {
1155 1105 license = [ pkgs.lib.licenses.zpl21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
@@ -1167,11 +1117,11 b' self: super: {'
1167 1117 };
1168 1118 };
1169 1119 "py" = super.buildPythonPackage {
1170 name = "py-1.5.3";
1120 name = "py-1.6.0";
1171 1121 doCheck = false;
1172 1122 src = fetchurl {
1173 url = "https://files.pythonhosted.org/packages/f7/84/b4c6e84672c4ceb94f727f3da8344037b62cee960d80e999b1cd9b832d83/py-1.5.3.tar.gz";
1174 sha256 = "10gq2lckvgwlk9w6yzijhzkarx44hsaknd0ypa08wlnpjnsgmj99";
1123 url = "https://files.pythonhosted.org/packages/4f/38/5f427d1eedae73063ce4da680d2bae72014995f9fdeaa57809df61c968cd/py-1.6.0.tar.gz";
1124 sha256 = "1wcs3zv9wl5m5x7p16avqj2gsrviyb23yvc3pr330isqs0sh98q6";
1175 1125 };
1176 1126 meta = {
1177 1127 license = [ pkgs.lib.licenses.mit ];
@@ -1393,6 +1343,22 b' self: super: {'
1393 1343 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1394 1344 };
1395 1345 };
1346 "pyramid-mailer" = super.buildPythonPackage {
1347 name = "pyramid-mailer-0.15.1";
1348 doCheck = false;
1349 propagatedBuildInputs = [
1350 self."pyramid"
1351 self."repoze.sendmail"
1352 self."transaction"
1353 ];
1354 src = fetchurl {
1355 url = "https://files.pythonhosted.org/packages/a0/f2/6febf5459dff4d7e653314d575469ad2e11b9d2af2c3606360e1c67202f2/pyramid_mailer-0.15.1.tar.gz";
1356 sha256 = "16vg8jb203jgb7b0hd6wllfqvp542qh2ry1gjai2m6qpv5agy2pc";
1357 };
1358 meta = {
1359 license = [ pkgs.lib.licenses.bsdOriginal ];
1360 };
1361 };
1396 1362 "pyramid-mako" = super.buildPythonPackage {
1397 1363 name = "pyramid-mako-1.0.2";
1398 1364 doCheck = false;
@@ -1420,7 +1386,7 b' self: super: {'
1420 1386 };
1421 1387 };
1422 1388 "pytest" = super.buildPythonPackage {
1423 name = "pytest-3.6.0";
1389 name = "pytest-3.8.2";
1424 1390 doCheck = false;
1425 1391 propagatedBuildInputs = [
1426 1392 self."py"
@@ -1431,25 +1397,26 b' self: super: {'
1431 1397 self."atomicwrites"
1432 1398 self."pluggy"
1433 1399 self."funcsigs"
1400 self."pathlib2"
1434 1401 ];
1435 1402 src = fetchurl {
1436 url = "https://files.pythonhosted.org/packages/67/6a/5bcdc22f8dbada1d2910d6e1a3a03f6b14306c78f81122890735b28be4bf/pytest-3.6.0.tar.gz";
1437 sha256 = "0bdfazvjjbxssqzyvkb3m2x2in7xv56ipr899l00s87k7815sm9r";
1403 url = "https://files.pythonhosted.org/packages/5f/d2/7f77f406ac505abda02ab4afb50d06ebf304f6ea42fca34f8f37529106b2/pytest-3.8.2.tar.gz";
1404 sha256 = "18nrwzn61kph2y6gxwfz9ms68rfvr9d4vcffsxng9p7jk9z18clk";
1438 1405 };
1439 1406 meta = {
1440 1407 license = [ pkgs.lib.licenses.mit ];
1441 1408 };
1442 1409 };
1443 1410 "pytest-cov" = super.buildPythonPackage {
1444 name = "pytest-cov-2.5.1";
1411 name = "pytest-cov-2.6.0";
1445 1412 doCheck = false;
1446 1413 propagatedBuildInputs = [
1447 1414 self."pytest"
1448 1415 self."coverage"
1449 1416 ];
1450 1417 src = fetchurl {
1451 url = "https://files.pythonhosted.org/packages/24/b4/7290d65b2f3633db51393bdf8ae66309b37620bc3ec116c5e357e3e37238/pytest-cov-2.5.1.tar.gz";
1452 sha256 = "0bbfpwdh9k3636bxc88vz9fa7vf4akchgn513ql1vd0xy4n7bah3";
1418 url = "https://files.pythonhosted.org/packages/d9/e2/58f90a316fbd94dd50bf5c826a23f3f5d079fb3cc448c1e9f0e3c33a3d2a/pytest-cov-2.6.0.tar.gz";
1419 sha256 = "0qnpp9y3ygx4jk4pf5ad71fh2skbvnr6gl54m7rg5qysnx4g0q73";
1453 1420 };
1454 1421 meta = {
1455 1422 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.mit ];
@@ -1498,14 +1465,14 b' self: super: {'
1498 1465 };
1499 1466 };
1500 1467 "pytest-timeout" = super.buildPythonPackage {
1501 name = "pytest-timeout-1.2.1";
1468 name = "pytest-timeout-1.3.2";
1502 1469 doCheck = false;
1503 1470 propagatedBuildInputs = [
1504 1471 self."pytest"
1505 1472 ];
1506 1473 src = fetchurl {
1507 url = "https://files.pythonhosted.org/packages/be/e9/a9106b8bc87521c6813060f50f7d1fdc15665bc1bbbe71c0ffc1c571aaa2/pytest-timeout-1.2.1.tar.gz";
1508 sha256 = "1kdp6qbh5v1168l99rba5yfzvy05gmzkmkhldgp36p9xcdjd5dv8";
1474 url = "https://files.pythonhosted.org/packages/8c/3e/1b6a319d12ae7baa3acb7c18ff2c8630a09471a0319d43535c683b4d03eb/pytest-timeout-1.3.2.tar.gz";
1475 sha256 = "09wnmzvnls2mnsdz7x3c3sk2zdp6jl4dryvyj5i8hqz16q2zq5qi";
1509 1476 };
1510 1477 meta = {
1511 1478 license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ];
@@ -1620,6 +1587,22 b' self: super: {'
1620 1587 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1621 1588 };
1622 1589 };
1590 "repoze.sendmail" = super.buildPythonPackage {
1591 name = "repoze.sendmail-4.4.1";
1592 doCheck = false;
1593 propagatedBuildInputs = [
1594 self."setuptools"
1595 self."zope.interface"
1596 self."transaction"
1597 ];
1598 src = fetchurl {
1599 url = "https://files.pythonhosted.org/packages/12/4e/8ef1fd5c42765d712427b9c391419a77bd48877886d2cbc5e9f23c8cad9b/repoze.sendmail-4.4.1.tar.gz";
1600 sha256 = "096ln02jr2afk7ab9j2czxqv2ryqq7m86ah572nqplx52iws73ks";
1601 };
1602 meta = {
1603 license = [ pkgs.lib.licenses.zpl21 ];
1604 };
1605 };
1623 1606 "requests" = super.buildPythonPackage {
1624 1607 name = "requests-2.9.1";
1625 1608 doCheck = false;
@@ -1632,7 +1615,7 b' self: super: {'
1632 1615 };
1633 1616 };
1634 1617 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1635 name = "rhodecode-enterprise-ce-4.13.3";
1618 name = "rhodecode-enterprise-ce-4.14.0";
1636 1619 buildInputs = [
1637 1620 self."pytest"
1638 1621 self."py"
@@ -1640,8 +1623,8 b' self: super: {'
1640 1623 self."pytest-sugar"
1641 1624 self."pytest-runner"
1642 1625 self."pytest-profiling"
1626 self."pytest-timeout"
1643 1627 self."gprof2dot"
1644 self."pytest-timeout"
1645 1628 self."mock"
1646 1629 self."webtest"
1647 1630 self."cov-core"
@@ -1688,7 +1671,6 b' self: super: {'
1688 1671 self."mysql-python"
1689 1672 self."pymysql"
1690 1673 self."pyotp"
1691 self."objgraph"
1692 1674 self."packaging"
1693 1675 self."paste"
1694 1676 self."pastedeploy"
@@ -1709,6 +1691,7 b' self: super: {'
1709 1691 self."pyramid-jinja2"
1710 1692 self."pyramid-mako"
1711 1693 self."pyramid"
1694 self."pyramid-mailer"
1712 1695 self."pysqlite"
1713 1696 self."python-dateutil"
1714 1697 self."python-ldap"
@@ -1722,7 +1705,6 b' self: super: {'
1722 1705 self."repoze.lru"
1723 1706 self."requests"
1724 1707 self."routes"
1725 self."setproctitle"
1726 1708 self."simplejson"
1727 1709 self."six"
1728 1710 self."sqlalchemy"
@@ -1756,10 +1738,9 b' self: super: {'
1756 1738 self."greenlet"
1757 1739 self."gunicorn"
1758 1740 self."waitress"
1741 self."setproctitle"
1759 1742 self."ipdb"
1760 1743 self."ipython"
1761 self."cprofilev"
1762 self."bottle"
1763 1744 self."rhodecode-tools"
1764 1745 self."appenlight-client"
1765 1746 self."pytest"
@@ -1768,8 +1749,8 b' self: super: {'
1768 1749 self."pytest-sugar"
1769 1750 self."pytest-runner"
1770 1751 self."pytest-profiling"
1752 self."pytest-timeout"
1771 1753 self."gprof2dot"
1772 self."pytest-timeout"
1773 1754 self."mock"
1774 1755 self."webtest"
1775 1756 self."cov-core"
@@ -1781,7 +1762,7 b' self: super: {'
1781 1762 };
1782 1763 };
1783 1764 "rhodecode-tools" = super.buildPythonPackage {
1784 name = "rhodecode-tools-0.16.0";
1765 name = "rhodecode-tools-1.0.1";
1785 1766 doCheck = false;
1786 1767 propagatedBuildInputs = [
1787 1768 self."click"
@@ -1796,11 +1777,11 b' self: super: {'
1796 1777 self."whoosh"
1797 1778 ];
1798 1779 src = fetchurl {
1799 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.16.0.tar.gz?md5=87f81286b49156c2ac36f1a1acfa2164";
1800 sha256 = "00xcc2mj99lx9d0ksml0p2xrd00kf5ypwyigg58cc9j9bznx7mzr";
1780 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v1.0.1.tar.gz?md5=ffb5d6bcb855305b93cfe23ad42e500b";
1781 sha256 = "0nr300s4sg685qs4wgbwlplwriawrwi6jq79z37frcnpyc89gpvm";
1801 1782 };
1802 1783 meta = {
1803 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1784 license = [ { fullName = "Apache 2.0 and Proprietary"; } ];
1804 1785 };
1805 1786 };
1806 1787 "routes" = super.buildPythonPackage {
@@ -1841,11 +1822,11 b' self: super: {'
1841 1822 };
1842 1823 };
1843 1824 "setuptools" = super.buildPythonPackage {
1844 name = "setuptools-40.1.0";
1825 name = "setuptools-40.4.3";
1845 1826 doCheck = false;
1846 1827 src = fetchurl {
1847 url = "https://files.pythonhosted.org/packages/5a/df/b2e3d9693bb0dcbeac516a73dd7a9eb82b126ae52e4a74605a9b01beddd5/setuptools-40.1.0.zip";
1848 sha256 = "0w1blx5ajga5y15dci0mddk49cf2xpq0mp7rp7jrqr2diqk00ib6";
1828 url = "https://files.pythonhosted.org/packages/6e/9c/6a003320b00ef237f94aa74e4ad66c57a7618f6c79d67527136e2544b728/setuptools-40.4.3.zip";
1829 sha256 = "058v6zns4634n4al2nmmvp15j8nrgwn8wjrbdks47wk3vm05gg5c";
1849 1830 };
1850 1831 meta = {
1851 1832 license = [ pkgs.lib.licenses.mit ];
@@ -1922,11 +1903,11 b' self: super: {'
1922 1903 };
1923 1904 };
1924 1905 "subprocess32" = super.buildPythonPackage {
1925 name = "subprocess32-3.5.1";
1906 name = "subprocess32-3.5.2";
1926 1907 doCheck = false;
1927 1908 src = fetchurl {
1928 url = "https://files.pythonhosted.org/packages/de/fb/fd3e91507021e2aecdb081d1b920082628d6b8869ead845e3e87b3d2e2ca/subprocess32-3.5.1.tar.gz";
1929 sha256 = "0wgi3bfnssid1g6h0v803z3k1wjal6il16nr3r9c587cfzwfkv0q";
1909 url = "https://files.pythonhosted.org/packages/c3/5f/7117737fc7114061837a4f51670d863dd7f7f9c762a6546fa8a0dcfe61c8/subprocess32-3.5.2.tar.gz";
1910 sha256 = "11v62shwmdys48g7ncs3a8jwwnkcl8d4zcwy6dk73z1zy2f9hazb";
1930 1911 };
1931 1912 meta = {
1932 1913 license = [ pkgs.lib.licenses.psfl ];
@@ -1969,11 +1950,11 b' self: super: {'
1969 1950 };
1970 1951 };
1971 1952 "testpath" = super.buildPythonPackage {
1972 name = "testpath-0.3.1";
1953 name = "testpath-0.4.2";
1973 1954 doCheck = false;
1974 1955 src = fetchurl {
1975 url = "https://files.pythonhosted.org/packages/f4/8b/b71e9ee10e5f751e9d959bc750ab122ba04187f5aa52aabdc4e63b0e31a7/testpath-0.3.1.tar.gz";
1976 sha256 = "02bnmkvm6a8a1p5kcygylcd19v2s040qw3zp1n8ab3bqkj1kflqd";
1956 url = "https://files.pythonhosted.org/packages/06/30/9a7e917066d851d8b4117e85794b5f14516419ea714a8a2681ec6aa8a981/testpath-0.4.2.tar.gz";
1957 sha256 = "1y40hywscnnyb734pnzm55nd8r8kp1072bjxbil83gcd53cv755n";
1977 1958 };
1978 1959 meta = {
1979 1960 license = [ ];
@@ -1996,6 +1977,20 b' self: super: {'
1996 1977 license = [ pkgs.lib.licenses.bsdOriginal ];
1997 1978 };
1998 1979 };
1980 "transaction" = super.buildPythonPackage {
1981 name = "transaction-2.4.0";
1982 doCheck = false;
1983 propagatedBuildInputs = [
1984 self."zope.interface"
1985 ];
1986 src = fetchurl {
1987 url = "https://files.pythonhosted.org/packages/9d/7d/0e8af0d059e052b9dcf2bb5a08aad20ae3e238746bdd3f8701a60969b363/transaction-2.4.0.tar.gz";
1988 sha256 = "17wz1y524ca07vr03yddy8dv0gbscs06dbdywmllxv5rc725jq3j";
1989 };
1990 meta = {
1991 license = [ pkgs.lib.licenses.zpl21 ];
1992 };
1993 };
1999 1994 "translationstring" = super.buildPythonPackage {
2000 1995 name = "translationstring-1.3";
2001 1996 doCheck = false;
@@ -23,9 +23,6 b' pkgs.stdenv.mkDerivation {'
23 23 pip2nix.pip2nix
24 24 pythonPackages.pip-tools
25 25
26 # Allows to generate bower dependencies
27 pkgs.nodePackages.bower2nix
28
29 26 # Allows to generate node dependencies
30 27 pkgs.nodePackages.node2nix
31 28
@@ -1,14 +1,12 b''
1 1 # This file defines how to "build" for packaging.
2 2
3 { pkgs ? import <nixpkgs> {}
4 , doCheck ? false
3 { doCheck ? false
5 4 }:
6 5
7 6 let
8 7 enterprise_ce = import ./default.nix {
9 8 inherit
10 doCheck
11 pkgs;
9 doCheck;
12 10
13 11 # disable checkPhase for build
14 12 checkPhase = ''
@@ -4,8 +4,8 b' setuptools-scm==2.1.0'
4 4 amqp==2.3.1
5 5 # not released authomatic that has updated some oauth providers
6 6 https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801#egg=authomatic==0.1.0.post1
7 atomicwrites==1.1.5
8 attrs==18.1.0
7 atomicwrites==1.2.1
8 attrs==18.2.0
9 9 babel==1.3
10 10 beaker==1.9.1
11 11 celery==4.1.1
@@ -19,7 +19,7 b' cssselect==1.0.3'
19 19 decorator==4.1.2
20 20 deform==2.0.5
21 21 docutils==0.14.0
22 dogpile.cache==0.6.6
22 dogpile.cache==0.6.7
23 23 dogpile.core==0.4.1
24 24 ecdsa==0.13
25 25 formencode==1.2.4
@@ -40,15 +40,14 b' msgpack-python==0.5.6'
40 40 mysql-python==1.2.5
41 41 pymysql==0.8.1
42 42 pyotp==2.2.6
43 objgraph==3.1.1
44 43 packaging==15.2
45 44 paste==2.0.3
46 45 pastedeploy==1.5.2
47 46 pastescript==2.0.2
48 pathlib2==2.3.0
47 pathlib2==2.3.2
49 48 peppercorn==0.5
50 psutil==5.4.6
51 psycopg2==2.7.4
49 psutil==5.4.7
50 psycopg2==2.7.5
52 51 py-bcrypt==0.4
53 52 pycrypto==2.6.1
54 53 pycurl==7.43.0.2
@@ -61,6 +60,7 b' pyramid-debugtoolbar==4.4.0'
61 60 pyramid-jinja2==2.7
62 61 pyramid-mako==1.0.2
63 62 pyramid==1.9.2
63 pyramid_mailer==0.15.1
64 64 pysqlite==2.8.3
65 65 python-dateutil
66 66 python-ldap==3.1.0
@@ -74,12 +74,11 b' redis==2.10.6'
74 74 repoze.lru==0.7
75 75 requests==2.9.1
76 76 routes==2.4.1
77 setproctitle==1.1.10
78 77 simplejson==3.11.1
79 78 six==1.11.0
80 79 sqlalchemy==1.1.18
81 80 sshpubkeys==2.2.0
82 subprocess32==3.5.1
81 subprocess32==3.5.2
83 82 supervisor==3.3.4
84 83 tempita==0.5.2
85 84 translationstring==1.3
@@ -113,22 +112,24 b' invoke==0.13.0'
113 112 bumpversion==0.5.3
114 113
115 114 ## http servers
116 gevent==1.3.5
117 greenlet==0.4.13
115 gevent==1.3.6
116 greenlet==0.4.15
118 117 gunicorn==19.9.0
119 118 waitress==1.1.0
119 setproctitle==1.1.10
120 120
121 121 ## debug
122 122 ipdb==0.11.0
123 123 ipython==5.1.0
124 cprofilev==1.0.7
125 bottle==0.12.13
126 124
127 125 ## rhodecode-tools, special case
128 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.16.0.tar.gz?md5=87f81286b49156c2ac36f1a1acfa2164#egg=rhodecode-tools==0.16.0
126 https://code.rhodecode.com/rhodecode-tools-ce/archive/v1.0.1.tar.gz?md5=ffb5d6bcb855305b93cfe23ad42e500b#egg=rhodecode-tools==1.0.1
129 127
130 128 ## appenlight
131 129 appenlight-client==0.6.25
132 130
133 131 ## test related requirements
134 132 -r requirements_test.txt
133
134 ## uncomment to add the debug libraries
135 #-r requirements_debug.txt
@@ -1,14 +1,14 b''
1 1 # test related requirements
2 pytest==3.6.0
3 py==1.5.3
4 pytest-cov==2.5.1
2 pytest==3.8.2
3 py==1.6.0
4 pytest-cov==2.6.0
5 5 pytest-sugar==0.9.1
6 6 pytest-runner==4.2.0
7 7 pytest-profiling==1.3.0
8 pytest-timeout==1.3.2
8 9 gprof2dot==2017.9.19
9 pytest-timeout==1.2.1
10 10
11 11 mock==1.0.1
12 12 webtest==2.0.29
13 13 cov-core==1.15.0
14 coverage==3.7.1
14 coverage==4.5.1
@@ -1,1 +1,1 b''
1 4.13.3 No newline at end of file
1 4.14.0 No newline at end of file
@@ -51,7 +51,7 b' PYRAMID_SETTINGS = {}'
51 51 EXTENSIONS = {}
52 52
53 53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
54 __dbversion__ = 90 # defines current db version for migrations
54 __dbversion__ = 91 # defines current db version for migrations
55 55 __platform__ = platform.system()
56 56 __license__ = 'AGPLv3, and Commercial License'
57 57 __author__ = 'RhodeCode GmbH'
@@ -204,7 +204,7 b' def request_view(request):'
204 204 message='Request from IP:%s not allowed' % (
205 205 request.rpc_ip_addr,))
206 206 else:
207 log.info('Access for IP:%s allowed' % (request.rpc_ip_addr,))
207 log.info('Access for IP:%s allowed', request.rpc_ip_addr)
208 208
209 209 # register our auth-user
210 210 request.rpc_user = auth_u
@@ -352,8 +352,7 b' def setup_request(request):'
352 352 request.rpc_params = json_body['args'] \
353 353 if isinstance(json_body['args'], dict) else {}
354 354
355 log.debug(
356 'method: %s, params: %s' % (request.rpc_method, request.rpc_params))
355 log.debug('method: %s, params: %s', request.rpc_method, request.rpc_params)
357 356 except KeyError as e:
358 357 raise JSONRPCError('Incorrect JSON data. Missing %s' % e)
359 358
@@ -20,7 +20,9 b''
20 20
21 21
22 22 class JSONRPCBaseError(Exception):
23 pass
23 def __init__(self, message='', *args):
24 self.message = message
25 super(JSONRPCBaseError, self).__init__(message, *args)
24 26
25 27
26 28 class JSONRPCError(JSONRPCBaseError):
@@ -31,7 +33,8 b' class JSONRPCValidationError(JSONRPCBase'
31 33
32 34 def __init__(self, *args, **kwargs):
33 35 self.colander_exception = kwargs.pop('colander_exc')
34 super(JSONRPCValidationError, self).__init__(*args, **kwargs)
36 super(JSONRPCValidationError, self).__init__(
37 message=self.colander_exception, *args)
35 38
36 39
37 40 class JSONRPCForbidden(JSONRPCBaseError):
@@ -65,7 +65,7 b' class TestCommentCommit(object):'
65 65 self, backend, status_change, message, commit_id,
66 66 no_notifications):
67 67
68 commit_id = backend.repo.scm_instance().get_changeset(commit_id).raw_id
68 commit_id = backend.repo.scm_instance().get_commit(commit_id).raw_id
69 69
70 70 id_, params = build_data(
71 71 self.apikey, 'comment_commit', repoid=backend.repo_name,
@@ -74,7 +74,7 b' class TestCommentCommit(object):'
74 74 repo = backend.repo.scm_instance()
75 75 expected = {
76 76 'msg': 'Commented on commit `%s` for repository `%s`' % (
77 repo.get_changeset().raw_id, backend.repo_name),
77 repo.get_commit().raw_id, backend.repo_name),
78 78 'status_change': status_change,
79 79 'success': True
80 80 }
@@ -66,6 +66,7 b' class TestCreatePullRequestApi(object):'
66 66 expected_message = "Created new pull request `{title}`".format(
67 67 title=data['title'])
68 68 result = response.json
69 assert result['error'] == None
69 70 assert result['result']['msg'] == expected_message
70 71 pull_request_id = result['result']['pull_request_id']
71 72 pull_request = PullRequestModel().get(pull_request_id)
@@ -88,6 +89,7 b' class TestCreatePullRequestApi(object):'
88 89 expected_message = "Created new pull request `{title}`".format(
89 90 title=data['title'])
90 91 result = response.json
92 assert result['error'] == None
91 93 assert result['result']['msg'] == expected_message
92 94 pull_request_id = result['result']['pull_request_id']
93 95 pull_request = PullRequestModel().get(pull_request_id)
@@ -127,6 +129,7 b' class TestCreatePullRequestApi(object):'
127 129 expected_message = "Created new pull request `{title}`".format(
128 130 title=data['title'])
129 131 result = response.json
132 assert result['error'] == None
130 133 assert result['result']['msg'] == expected_message
131 134 pull_request_id = result['result']['pull_request_id']
132 135 pull_request = PullRequestModel().get(pull_request_id)
@@ -170,6 +173,7 b' class TestCreatePullRequestApi(object):'
170 173 expected_message = "Created new pull request `{title}`".format(
171 174 title=data['title'])
172 175 result = response.json
176 assert result['error'] == None
173 177 assert result['result']['msg'] == expected_message
174 178 pull_request_id = result['result']['pull_request_id']
175 179 pull_request = PullRequestModel().get(pull_request_id)
@@ -19,7 +19,7 b''
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import os
22
22 import mock
23 23 import pytest
24 24
25 25 from rhodecode.tests import TESTS_TMP_PATH
@@ -29,6 +29,7 b' from rhodecode.api.tests.utils import ('
29 29
30 30 @pytest.mark.usefixtures("testuser_api", "app")
31 31 class TestPull(object):
32
32 33 @pytest.mark.backends("git", "hg")
33 34 def test_api_pull(self, backend):
34 35 r = backend.create_repo()
@@ -37,12 +38,13 b' class TestPull(object):'
37 38 r.clone_uri = clone_uri
38 39
39 40 id_, params = build_data(self.apikey, 'pull', repoid=repo_name,)
40 response = api_call(self.app, params)
41 msg = 'Pulled from url `%s` on repo `%s`' % (
42 clone_uri, repo_name)
43 expected = {'msg': msg,
44 'repository': repo_name}
45 assert_ok(id_, expected, given=response.body)
41 with mock.patch('rhodecode.model.scm.url_validator'):
42 response = api_call(self.app, params)
43 msg = 'Pulled from url `%s` on repo `%s`' % (
44 clone_uri, repo_name)
45 expected = {'msg': msg,
46 'repository': repo_name}
47 assert_ok(id_, expected, given=response.body)
46 48
47 49 def test_api_pull_error(self, backend):
48 50 id_, params = build_data(
@@ -89,7 +89,6 b' class TestUpdatePullRequest(object):'
89 89 pr_util.update_source_repository(head='c')
90 90 repo = pull_request.source_repo.scm_instance()
91 91 commits = [x for x in repo.get_commits()]
92 print commits
93 92
94 93 added_commit_id = commits[-1].raw_id # c commit
95 94 common_commit_id = commits[1].raw_id # b commit is common ancestor
@@ -26,7 +26,7 b' from rhodecode.tests import TEST_USER_AD'
26 26 from rhodecode.api.tests.utils import (
27 27 build_data, api_call, assert_error, assert_ok, crash, jsonify)
28 28 from rhodecode.tests.fixture import Fixture
29 from rhodecode.tests.plugin import http_host_stub, http_host_only_stub
29 from rhodecode.tests.plugin import plain_http_host_only_stub
30 30
31 31 fixture = Fixture()
32 32
@@ -56,9 +56,15 b' class TestApiUpdateRepo(object):'
56 56 ({'clone_uri': ''},
57 57 {'clone_uri': ''}),
58 58
59 ({'clone_uri': 'http://example.com/repo_pull'},
60 {'clone_uri': 'http://example.com/repo_pull'}),
61
59 62 ({'push_uri': ''},
60 63 {'push_uri': ''}),
61 64
65 ({'push_uri': 'http://example.com/repo_push'},
66 {'push_uri': 'http://example.com/repo_push'}),
67
62 68 ({'landing_rev': 'rev:tip'},
63 69 {'landing_rev': ['rev', 'tip']}),
64 70
@@ -74,7 +80,7 b' class TestApiUpdateRepo(object):'
74 80 ({'repo_name': 'new_repo_name'},
75 81 {
76 82 'repo_name': 'new_repo_name',
77 'url': 'http://{}/new_repo_name'.format(http_host_only_stub())
83 'url': 'http://{}/new_repo_name'.format(plain_http_host_only_stub())
78 84 }),
79 85
80 86 ({'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME),
@@ -82,7 +88,7 b' class TestApiUpdateRepo(object):'
82 88 {
83 89 'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME),
84 90 'url': 'http://{}/test_group_for_update/{}'.format(
85 http_host_only_stub(), UPDATE_REPO_NAME)
91 plain_http_host_only_stub(), UPDATE_REPO_NAME)
86 92 }),
87 93 ])
88 94 def test_api_update_repo(self, updates, expected, backend):
@@ -33,7 +33,7 b' from rhodecode.lib import audit_logger'
33 33 from rhodecode.lib import repo_maintenance
34 34 from rhodecode.lib.auth import HasPermissionAnyApi, HasUserGroupPermissionAnyApi
35 35 from rhodecode.lib.celerylib.utils import get_task_id
36 from rhodecode.lib.utils2 import str2bool, time_to_datetime
36 from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_str
37 37 from rhodecode.lib.ext_json import json
38 38 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
39 39 from rhodecode.model.changeset_status import ChangesetStatusModel
@@ -316,7 +316,7 b' def get_repo_changeset(request, apiuser,'
316 316 try:
317 317 cs = repo.get_commit(commit_id=revision, pre_load=pre_load)
318 318 except TypeError as e:
319 raise JSONRPCError(e.message)
319 raise JSONRPCError(safe_str(e))
320 320 _cs_json = cs.__json__()
321 321 _cs_json['diff'] = build_commit_data(cs, changes_details)
322 322 if changes_details == 'full':
@@ -382,7 +382,7 b' def get_repo_changesets(request, apiuser'
382 382 commits = vcs_repo.get_commits(
383 383 start_id=start_rev, pre_load=pre_load)
384 384 except TypeError as e:
385 raise JSONRPCError(e.message)
385 raise JSONRPCError(safe_str(e))
386 386 except Exception:
387 387 log.exception('Fetching of commits failed')
388 388 raise JSONRPCError('Error occurred during commit fetching')
@@ -1433,7 +1433,7 b' def comment_commit('
1433 1433 commit_id = repo.scm_instance().get_commit(commit_id=commit_id).raw_id
1434 1434 except Exception as e:
1435 1435 log.exception('Failed to fetch commit')
1436 raise JSONRPCError(e.message)
1436 raise JSONRPCError(safe_str(e))
1437 1437
1438 1438 if isinstance(userid, Optional):
1439 1439 userid = apiuser.user_id
@@ -25,7 +25,8 b' import operator'
25 25 from pyramid.httpexceptions import HTTPFound, HTTPForbidden, HTTPBadRequest
26 26
27 27 from rhodecode.lib import helpers as h, diffs
28 from rhodecode.lib.utils2 import StrictAttributeDict, safe_int, datetime_to_time
28 from rhodecode.lib.utils2 import (
29 StrictAttributeDict, safe_int, datetime_to_time, safe_unicode)
29 30 from rhodecode.lib.vcs.exceptions import RepositoryRequirementError
30 31 from rhodecode.model import repo
31 32 from rhodecode.model import repo_group
@@ -61,12 +62,13 b' def add_route_with_slash(config,name, pa'
61 62 config.add_route(name + '_slash', pattern + '/', **kw)
62 63
63 64
64 def add_route_requirements(route_path, requirements=URL_NAME_REQUIREMENTS):
65 def add_route_requirements(route_path, requirements=None):
65 66 """
66 67 Adds regex requirements to pyramid routes using a mapping dict
67 68 e.g::
68 69 add_route_requirements('{repo_name}/settings')
69 70 """
71 requirements = requirements or URL_NAME_REQUIREMENTS
70 72 for key, regex in requirements.items():
71 73 route_path = route_path.replace('{%s}' % key, '{%s:%s}' % (key, regex))
72 74 return route_path
@@ -201,7 +203,7 b' class RepoAppView(BaseAppView):'
201 203 def _handle_missing_requirements(self, error):
202 204 log.error(
203 205 'Requirements are missing for repository %s: %s',
204 self.db_repo_name, error.message)
206 self.db_repo_name, safe_unicode(error))
205 207
206 208 def _get_local_tmpl_context(self, include_app_defaults=True):
207 209 _ = self.request.translate
@@ -301,7 +303,8 b' class PathFilter(object):'
301 303
302 304 def render_patchset_filtered(self, diffset, patchset, source_ref=None, target_ref=None):
303 305 filtered_patchset, has_hidden_changes = self.filter_patchset(patchset)
304 result = diffset.render_patchset(filtered_patchset, source_ref=source_ref, target_ref=target_ref)
306 result = diffset.render_patchset(
307 filtered_patchset, source_ref=source_ref, target_ref=target_ref)
305 308 result.has_hidden_changes = has_hidden_changes
306 309 return result
307 310
@@ -505,6 +508,36 b' class RepoRoutePredicate(object):'
505 508 return False
506 509
507 510
511 class RepoForbidArchivedRoutePredicate(object):
512 def __init__(self, val, config):
513 self.val = val
514
515 def text(self):
516 return 'repo_forbid_archived = %s' % self.val
517
518 phash = text
519
520 def __call__(self, info, request):
521 _ = request.translate
522 rhodecode_db_repo = request.db_repo
523
524 log.debug(
525 '%s checking if archived flag for repo for %s',
526 self.__class__.__name__, rhodecode_db_repo.repo_name)
527
528 if rhodecode_db_repo.archived:
529 log.warning('Current view is not supported for archived repo:%s',
530 rhodecode_db_repo.repo_name)
531
532 h.flash(
533 h.literal(_('Action not supported for archived repository.')),
534 category='warning')
535 summary_url = request.route_path(
536 'repo_summary', repo_name=rhodecode_db_repo.repo_name)
537 raise HTTPFound(summary_url)
538 return True
539
540
508 541 class RepoTypeRoutePredicate(object):
509 542 def __init__(self, val, config):
510 543 self.val = val or ['hg', 'git', 'svn']
@@ -530,13 +563,6 b' class RepoTypeRoutePredicate(object):'
530 563 else:
531 564 log.warning('Current view is not supported for repo type:%s',
532 565 rhodecode_db_repo.repo_type)
533
534 # h.flash(h.literal(
535 # _('Action not supported for %s.' % rhodecode_repo.alias)),
536 # category='warning')
537 # return redirect(
538 # route_path('repo_summary', repo_name=cls.rhodecode_db_repo.repo_name))
539
540 566 return False
541 567
542 568
@@ -643,10 +669,12 b' def includeme(config):'
643 669 config.add_route_predicate(
644 670 'repo_accepted_types', RepoTypeRoutePredicate)
645 671 config.add_route_predicate(
672 'repo_forbid_when_archived', RepoForbidArchivedRoutePredicate)
673 config.add_route_predicate(
646 674 'repo_group_route', RepoGroupRoutePredicate)
647 675 config.add_route_predicate(
648 676 'user_group_route', UserGroupRoutePredicate)
649 677 config.add_route_predicate(
650 678 'user_route_with_default', UserRouteWithDefaultPredicate)
651 679 config.add_route_predicate(
652 'user_route', UserRoutePredicate) No newline at end of file
680 'user_route', UserRoutePredicate)
@@ -488,14 +488,30 b' class TestLabsSettings(object):'
488 488 class TestOpenSourceLicenses(object):
489 489
490 490 def test_records_are_displayed(self, autologin_user):
491 sample_licenses = {
492 "python2.7-pytest-2.7.1": {
493 "UNKNOWN": None
491 sample_licenses = [
492 {
493 "license": [
494 {
495 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
496 "shortName": "bsdOriginal",
497 "spdxId": "BSD-4-Clause",
498 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
499 }
500 ],
501 "name": "python2.7-coverage-3.7.1"
494 502 },
495 "python2.7-Markdown-2.6.2": {
496 "BSD-3-Clause": "http://spdx.org/licenses/BSD-3-Clause"
497 }
498 }
503 {
504 "license": [
505 {
506 "fullName": "MIT License",
507 "shortName": "mit",
508 "spdxId": "MIT",
509 "url": "http://spdx.org/licenses/MIT.html"
510 }
511 ],
512 "name": "python2.7-bootstrapped-pip-9.0.1"
513 },
514 ]
499 515 read_licenses_patch = mock.patch(
500 516 'rhodecode.apps.admin.views.open_source_licenses.read_opensource_licenses',
501 517 return_value=sample_licenses)
@@ -506,10 +522,9 b' class TestOpenSourceLicenses(object):'
506 522 assert_response = AssertResponse(response)
507 523 assert_response.element_contains(
508 524 '.panel-heading', 'Licenses of Third Party Packages')
509 for name in sample_licenses:
510 response.mustcontain(name)
511 for license in sample_licenses[name]:
512 assert_response.element_contains('.panel-body', license)
525 for license_data in sample_licenses:
526 response.mustcontain(license_data["license"][0]["spdxId"])
527 assert_response.element_contains('.panel-body', license_data["name"])
513 528
514 529 def test_records_can_be_read(self, autologin_user):
515 530 response = self.app.get(
@@ -35,7 +35,6 b' class OpenSourceLicensesAdminSettingsVie'
35 35
36 36 def load_default_context(self):
37 37 c = self._get_local_tmpl_context()
38
39 38 return c
40 39
41 40 @LoginRequired()
@@ -47,7 +46,6 b' class OpenSourceLicensesAdminSettingsVie'
47 46 c = self.load_default_context()
48 47 c.active = 'open_source'
49 48 c.navlist = navigation_list(self.request)
50 items = sorted(read_opensource_licenses().items(), key=lambda t: t[0])
51 c.opensource_licenses = collections.OrderedDict(items)
52
49 c.opensource_licenses = sorted(
50 read_opensource_licenses(), key=lambda d: d["name"])
53 51 return self._get_template_context(c)
@@ -26,6 +26,7 b' from pyramid.view import view_config'
26 26
27 27 from rhodecode.apps._base import BaseAppView
28 28 from rhodecode.apps.admin.navigation import navigation_list
29 from rhodecode.lib import system_info
29 30 from rhodecode.lib.auth import (
30 31 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
31 32 from rhodecode.lib.utils2 import safe_int, StrictAttributeDict
@@ -71,6 +72,16 b' class AdminProcessManagementView(BaseApp'
71 72
72 73 return proc_list
73 74
75 def get_workers(self):
76 workers = None
77 try:
78 rc_config = system_info.rhodecode_config().value['config']
79 workers = rc_config['server:main'].get('workers')
80 except Exception:
81 pass
82
83 return workers or '?'
84
74 85 @LoginRequired()
75 86 @HasPermissionAllDecorator('hg.admin')
76 87 @view_config(
@@ -83,6 +94,7 b' class AdminProcessManagementView(BaseApp'
83 94 c.active = 'process_management'
84 95 c.navlist = navigation_list(self.request)
85 96 c.gunicorn_processes = self.get_processes()
97 c.gunicorn_workers = self.get_workers()
86 98 return self._get_template_context(c)
87 99
88 100 @LoginRequired()
@@ -26,7 +26,7 b' from pyramid.httpexceptions import HTTPB'
26 26
27 27 from rhodecode.apps._base import BaseAppView
28 28 from rhodecode.lib.channelstream import (
29 channelstream_request,
29 channelstream_request, get_channelstream_server_url,
30 30 ChannelstreamConnectionException,
31 31 ChannelstreamPermissionException,
32 32 check_channel_permissions,
@@ -56,8 +56,9 b' class ChannelstreamView(BaseAppView):'
56 56 @NotAnonymous()
57 57 @view_config(route_name='channelstream_connect', renderer='json_ext')
58 58 def connect(self):
59 """ handle authorization of users trying to connect """
60
59 61 self.load_default_context()
60 """ handle authorization of users trying to connect """
61 62 try:
62 63 json_body = self.request.json_body
63 64 except Exception:
@@ -107,11 +108,14 b' class ChannelstreamView(BaseAppView):'
107 108 'broadcast_presence_with_user_lists': True
108 109 }
109 110 # connect user to server
111 channelstream_url = get_channelstream_server_url(
112 self.channelstream_config, '/connect')
110 113 try:
111 connect_result = channelstream_request(self.channelstream_config,
112 payload, '/connect')
114 connect_result = channelstream_request(
115 self.channelstream_config, payload, '/connect')
113 116 except ChannelstreamConnectionException:
114 log.exception('Channelstream service is down')
117 log.exception(
118 'Channelstream service at {} is down'.format(channelstream_url))
115 119 return HTTPBadGateway()
116 120
117 121 connect_result['channels'] = channels
@@ -153,17 +157,21 b' class ChannelstreamView(BaseAppView):'
153 157 'store_history': True,
154 158 'broadcast_presence_with_user_lists': True
155 159 }
160
161 channelstream_url = get_channelstream_server_url(
162 self.channelstream_config, '/subscribe')
156 163 try:
157 164 connect_result = channelstream_request(
158 165 self.channelstream_config, payload, '/subscribe')
159 166 except ChannelstreamConnectionException:
160 log.exception('Channelstream service is down')
167 log.exception(
168 'Channelstream service at {} is down'.format(channelstream_url))
161 169 return HTTPBadGateway()
162 170 # include_channel_info will limit history only to new channel
163 171 # to not overwrite histories on other channels in client
164 172 connect_result['channels_info'] = parse_channels_info(
165 173 connect_result['channels_info'],
166 174 include_channel_info=filtered_channels)
167 update_history_from_logs(self.channelstream_config,
168 filtered_channels, connect_result)
175 update_history_from_logs(
176 self.channelstream_config, filtered_channels, connect_result)
169 177 return connect_result
@@ -21,22 +21,31 b' from rhodecode.apps._base import ADMIN_P'
21 21 from rhodecode.lib.utils2 import str2bool
22 22
23 23
24 def debug_style_enabled(info, request):
25 return str2bool(request.registry.settings.get('debug_style'))
24 class DebugStylePredicate(object):
25 def __init__(self, val, config):
26 self.val = val
27
28 def text(self):
29 return 'debug style route = %s' % self.val
30
31 phash = text
32
33 def __call__(self, info, request):
34 return str2bool(request.registry.settings.get('debug_style'))
26 35
27 36
28 37 def includeme(config):
38 config.add_route_predicate(
39 'debug_style', DebugStylePredicate)
40
29 41 config.add_route(
30 42 name='debug_style_home',
31 43 pattern=ADMIN_PREFIX + '/debug_style',
32 custom_predicates=(debug_style_enabled,))
44 debug_style=True)
33 45 config.add_route(
34 46 name='debug_style_template',
35 47 pattern=ADMIN_PREFIX + '/debug_style/t/{t_path}',
36 custom_predicates=(debug_style_enabled,))
48 debug_style=True)
37 49
38 50 # Scan module for configuration decorators.
39 51 config.scan('.views', ignore='.tests')
40
41
42
@@ -405,8 +405,8 b' class GistView(BaseAppView):'
405 405 revision = self.request.GET.get('revision')
406 406
407 407 if revision != last_rev.raw_id:
408 log.error('Last revision %s is different then submitted %s'
409 % (revision, last_rev))
408 log.error('Last revision %s is different then submitted %s',
409 revision, last_rev)
410 410 # our gist has newer version than we
411 411 success = False
412 412
@@ -63,6 +63,10 b' def includeme(config):'
63 63 name='markup_preview',
64 64 pattern='/_markup_preview')
65 65
66 config.add_route(
67 name='store_user_session_value',
68 pattern='/_store_session_attr')
69
66 70 # register our static links via redirection mechanism
67 71 routing_links.connect_redirection_links(config)
68 72
@@ -60,10 +60,9 b' class TestHomeController(TestController)'
60 60 response = self.app.get(route_path('home'))
61 61
62 62 rhodecode_version_hash = calculate_version_hash(
63 {'beaker.session.secret':'test-rc-uytcxaz'})
63 {'beaker.session.secret': 'test-rc-uytcxaz'})
64 64 response.mustcontain('style.css?ver={0}'.format(rhodecode_version_hash))
65 response.mustcontain('rhodecode-components.js?ver={0}'.format(
66 rhodecode_version_hash))
65 response.mustcontain('scripts.js?ver={0}'.format(rhodecode_version_hash))
67 66
68 67 def test_index_contains_backend_specific_details(self, backend):
69 68 self.log_user()
@@ -33,7 +33,7 b' from rhodecode.lib.index import searcher'
33 33 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
34 34 from rhodecode.lib.ext_json import json
35 35 from rhodecode.model.db import (
36 func, or_, in_filter_generator, Repository, RepoGroup, User, UserGroup)
36 func, true, or_, in_filter_generator, Repository, RepoGroup, User, UserGroup)
37 37 from rhodecode.model.repo import RepoModel
38 38 from rhodecode.model.repo_group import RepoGroupModel
39 39 from rhodecode.model.scm import RepoGroupList, RepoList
@@ -114,6 +114,7 b' class HomeView(BaseAppView):'
114 114 query = Repository.query()\
115 115 .order_by(func.length(Repository.repo_name))\
116 116 .order_by(Repository.repo_name)\
117 .filter(Repository.archived.isnot(true()))\
117 118 .filter(or_(
118 119 # generate multiple IN to fix limitation problems
119 120 *in_filter_generator(Repository.repo_id, allowed_ids)
@@ -444,3 +445,18 b' class HomeView(BaseAppView):'
444 445 if text:
445 446 return h.render(text, renderer=renderer, mentions=True)
446 447 return ''
448
449 @LoginRequired()
450 @CSRFRequired()
451 @view_config(
452 route_name='store_user_session_value', request_method='POST',
453 renderer='string', xhr=True)
454 def store_user_session_attr(self):
455 key = self.request.POST.get('key')
456 val = self.request.POST.get('val')
457
458 existing_value = self.request.session.get(key)
459 if existing_value != val:
460 self.request.session[key] = val
461
462 return 'stored:{}'.format(key)
@@ -93,16 +93,16 b' def get_came_from(request):'
93 93 allowed_schemes = ['http', 'https']
94 94 default_came_from = h.route_path('home')
95 95 if parsed.scheme and parsed.scheme not in allowed_schemes:
96 log.error('Suspicious URL scheme detected %s for url %s' %
97 (parsed.scheme, parsed))
96 log.error('Suspicious URL scheme detected %s for url %s',
97 parsed.scheme, parsed)
98 98 came_from = default_came_from
99 99 elif parsed.netloc and request.host != parsed.netloc:
100 100 log.error('Suspicious NETLOC detected %s for url %s server url '
101 'is: %s' % (parsed.netloc, parsed, request.host))
101 'is: %s', parsed.netloc, parsed, request.host)
102 102 came_from = default_came_from
103 103 elif any(bad_str in parsed.path for bad_str in ('\r', '\n')):
104 log.error('Header injection detected `%s` for url %s server url ' %
105 (parsed.path, parsed))
104 log.error('Header injection detected `%s` for url %s server url ',
105 parsed.path, parsed)
106 106 came_from = default_came_from
107 107
108 108 return came_from or default_came_from
@@ -29,6 +29,8 b' from rhodecode.lib import helpers as h'
29 29 from rhodecode.lib import audit_logger
30 30 from rhodecode.lib.auth import (
31 31 LoginRequired, HasRepoGroupPermissionAnyDecorator, CSRFRequired)
32 from rhodecode.lib.utils2 import safe_int
33 from rhodecode.model.db import UserGroup
32 34 from rhodecode.model.repo_group import RepoGroupModel
33 35 from rhodecode.model.forms import RepoGroupPermsForm
34 36 from rhodecode.model.meta import Session
@@ -101,6 +103,11 b' class RepoGroupPermissionsView(RepoGroup'
101 103 for change in changes['added'] + changes['updated'] + changes['deleted']:
102 104 if change['type'] == 'user':
103 105 affected_user_ids.append(change['id'])
106 if change['type'] == 'user_group':
107 user_group = UserGroup.get(safe_int(change['id']))
108 if user_group:
109 group_members_ids = [x.user_id for x in user_group.members]
110 affected_user_ids.extend(group_members_ids)
104 111
105 112 events.trigger(events.UserPermissionsChange(affected_user_ids))
106 113
@@ -231,11 +231,13 b' def includeme(config):'
231 231 config.add_route(
232 232 name='repo_fork_new',
233 233 pattern='/{repo_name:.*?[^/]}/fork', repo_route=True,
234 repo_forbid_when_archived=True,
234 235 repo_accepted_types=['hg', 'git'])
235 236
236 237 config.add_route(
237 238 name='repo_fork_create',
238 239 pattern='/{repo_name:.*?[^/]}/fork/create', repo_route=True,
240 repo_forbid_when_archived=True,
239 241 repo_accepted_types=['hg', 'git'])
240 242
241 243 config.add_route(
@@ -276,27 +278,29 b' def includeme(config):'
276 278 config.add_route(
277 279 name='pullrequest_new',
278 280 pattern='/{repo_name:.*?[^/]}/pull-request/new',
279 repo_route=True, repo_accepted_types=['hg', 'git'])
281 repo_route=True, repo_accepted_types=['hg', 'git'],
282 repo_forbid_when_archived=True)
280 283
281 284 config.add_route(
282 285 name='pullrequest_create',
283 286 pattern='/{repo_name:.*?[^/]}/pull-request/create',
284 repo_route=True, repo_accepted_types=['hg', 'git'])
287 repo_route=True, repo_accepted_types=['hg', 'git'],
288 repo_forbid_when_archived=True)
285 289
286 290 config.add_route(
287 291 name='pullrequest_update',
288 292 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/update',
289 repo_route=True)
293 repo_route=True, repo_forbid_when_archived=True)
290 294
291 295 config.add_route(
292 296 name='pullrequest_merge',
293 297 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/merge',
294 repo_route=True)
298 repo_route=True, repo_forbid_when_archived=True)
295 299
296 300 config.add_route(
297 301 name='pullrequest_delete',
298 302 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/delete',
299 repo_route=True)
303 repo_route=True, repo_forbid_when_archived=True)
300 304
301 305 config.add_route(
302 306 name='pullrequest_comment_create',
@@ -319,6 +323,9 b' def includeme(config):'
319 323 name='edit_repo_advanced',
320 324 pattern='/{repo_name:.*?[^/]}/settings/advanced', repo_route=True)
321 325 config.add_route(
326 name='edit_repo_advanced_archive',
327 pattern='/{repo_name:.*?[^/]}/settings/advanced/archive', repo_route=True)
328 config.add_route(
322 329 name='edit_repo_advanced_delete',
323 330 pattern='/{repo_name:.*?[^/]}/settings/advanced/delete', repo_route=True)
324 331 config.add_route(
@@ -97,9 +97,10 b' class TestRepoCommitCommentsView(TestCon'
97 97 comment_id = ChangesetComment.query().first().comment_id
98 98 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
99 99
100 sbj = 'left {0} on commit `{1}` in the {2} repository'.format(
101 comment_type, h.show_id(commit), backend.repo_name)
102 assert sbj in notification.subject
100 author = notification.created_by_user.username_and_name
101 sbj = '{0} left a {1} on commit `{2}` in the {3} repository'.format(
102 author, comment_type, h.show_id(commit), backend.repo_name)
103 assert sbj == notification.subject
103 104
104 105 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
105 106 backend.repo_name, commit_id, comment_id))
@@ -134,12 +135,18 b' class TestRepoCommitCommentsView(TestCon'
134 135 if backend.alias == 'svn':
135 136 response.mustcontain(
136 137 '''data-f-path="vcs/commands/summary.py" '''
137 '''id="a_c--ad05457a43f8"'''
138 '''data-anchor-id="c-300-ad05457a43f8"'''
138 139 )
139 else:
140 if backend.alias == 'git':
140 141 response.mustcontain(
141 142 '''data-f-path="vcs/backends/hg.py" '''
142 '''id="a_c--9c390eb52cd6"'''
143 '''data-anchor-id="c-883e775e89ea-9c390eb52cd6"'''
144 )
145
146 if backend.alias == 'hg':
147 response.mustcontain(
148 '''data-f-path="vcs/backends/hg.py" '''
149 '''data-anchor-id="c-e58d85a3973b-9c390eb52cd6"'''
143 150 )
144 151
145 152 assert Notification.query().count() == 1
@@ -150,12 +157,12 b' class TestRepoCommitCommentsView(TestCon'
150 157 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
151 158
152 159 assert comment.revision == commit_id
153 sbj = 'left {comment_type} on commit `{commit}` ' \
154 '(file: `{f_path}`) in the {repo} repository'.format(
155 commit=h.show_id(commit),
156 f_path=f_path, line=line, repo=backend.repo_name,
157 comment_type=comment_type)
158 assert sbj in notification.subject
160
161 author = notification.created_by_user.username_and_name
162 sbj = '{0} left a {1} on file `{2}` in commit `{3}` in the {4} repository'.format(
163 author, comment_type, f_path, h.show_id(commit), backend.repo_name)
164
165 assert sbj == notification.subject
159 166
160 167 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
161 168 backend.repo_name, commit_id, comment.comment_id))
@@ -222,10 +229,10 b' class TestRepoCommitCommentsView(TestCon'
222 229 comment_id = ChangesetComment.query().first().comment_id
223 230 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
224 231
225 sbj = 'left note on commit `{0}` (status: Approved) ' \
226 'in the {1} repository'.format(
227 h.show_id(commit), backend.repo_name)
228 assert sbj in notification.subject
232 author = notification.created_by_user.username_and_name
233 sbj = '[status: Approved] {0} left a note on commit `{1}` in the {2} repository'.format(
234 author, h.show_id(commit), backend.repo_name)
235 assert sbj == notification.subject
229 236
230 237 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
231 238 backend.repo_name, commit_id, comment_id))
@@ -283,7 +290,7 b' class TestRepoCommitCommentsView(TestCon'
283 290 commit_id = '0' * 16 # fake this for tests
284 291 response = self.app.post(
285 292 route_path('repo_commit_comment_preview',
286 repo_name=backend.repo_name, commit_id=commit_id,),
293 repo_name=backend.repo_name, commit_id=commit_id,),
287 294 params=params,
288 295 extra_environ=xhr_header)
289 296
@@ -88,7 +88,7 b' class TestRepoCommitView(object):'
88 88 response.mustcontain('21 files changed: 943 inserted, 288 deleted')
89 89
90 90 # files op files
91 response.mustcontain('File no longer present at commit: %s' %
91 response.mustcontain('File not present at commit: %s' %
92 92 _shorten_commit_id(commit_id))
93 93
94 94 # svn uses a different filename
@@ -133,7 +133,7 b' class TestRepoCommitView(object):'
133 133 response.mustcontain('21 files changed: 943 inserted, 288 deleted')
134 134
135 135 # files op files
136 response.mustcontain('File no longer present at commit: %s' %
136 response.mustcontain('File not present at commit: %s' %
137 137 _shorten_commit_id(commit_ids[1]))
138 138 response.mustcontain('Added docstrings to vcs.cli') # commit msg
139 139 response.mustcontain('Changed theme to ADC theme') # commit msg
@@ -163,7 +163,7 b' class TestRepoCommitView(object):'
163 163 response.mustcontain(_shorten_commit_id(commit_ids[1]))
164 164
165 165 # files op files
166 response.mustcontain('File no longer present at commit: %s' %
166 response.mustcontain('File not present at commit: %s' %
167 167 _shorten_commit_id(commit_ids[1]))
168 168
169 169 # svn is special
@@ -293,26 +293,13 b' Added a symlink'
293 293 """ + diffs['svn'],
294 294 }
295 295
296 def _check_diff_menus(self, response, right_menu=False,):
297 # diff menus
298 for elem in ['Show File', 'Unified Diff', 'Side-by-side Diff',
299 'Raw Diff', 'Download Diff']:
296 def _check_new_diff_menus(self, response, right_menu=False,):
297 # individual file diff menus
298 for elem in ['Show file before', 'Show file after']:
300 299 response.mustcontain(elem)
301 300
302 301 # right pane diff menus
303 302 if right_menu:
304 for elem in ['Ignore whitespace', 'Increase context',
305 'Hide comments']:
303 for elem in ['Hide whitespace changes', 'Toggle Wide Mode diff',
304 'Show full context diff']:
306 305 response.mustcontain(elem)
307
308 def _check_new_diff_menus(self, response, right_menu=False,):
309 # diff menus
310 for elem in ['Show file before', 'Show file after',
311 'Raw diff', 'Download diff']:
312 response.mustcontain(elem)
313
314 # right pane diff menus
315 if right_menu:
316 for elem in ['Ignore whitespace', 'Increase context',
317 'Hide comments']:
318 response.mustcontain(elem)
@@ -104,13 +104,11 b' class TestCompareView(object):'
104 104 # Comparing the revisions
105 105 response = self.app.get(
106 106 route_path('repo_compare',
107 repo_name=origin.repo_name,
108 source_ref_type="rev",
109 source_ref=commit3.raw_id,
110 target_ref_type="rev",
111 target_ref=commit4.raw_id,
112 params=dict(merge='1', target_repo=fork.repo_name)
113 ))
107 repo_name=origin.repo_name,
108 source_ref_type="rev", source_ref=commit3.raw_id,
109 target_ref_type="rev", target_ref=commit4.raw_id,
110 params=dict(merge='1', target_repo=fork.repo_name)
111 ))
114 112
115 113 compare_page = ComparePage(response)
116 114 compare_page.contains_commits([commit4])
@@ -142,13 +140,11 b' class TestCompareView(object):'
142 140
143 141 response = self.app.get(
144 142 route_path('repo_compare',
145 repo_name=repo1.repo_name,
146 source_ref_type="branch",
147 source_ref=commit_id2,
148 target_ref_type="branch",
149 target_ref=commit_id1,
150 params=dict(merge='1', target_repo=repo2.repo_name)
151 ))
143 repo_name=repo1.repo_name,
144 source_ref_type="branch", source_ref=commit_id2,
145 target_ref_type="branch", target_ref=commit_id1,
146 params=dict(merge='1', target_repo=repo2.repo_name)
147 ))
152 148
153 149 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
154 150 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
@@ -156,9 +152,9 b' class TestCompareView(object):'
156 152 compare_page = ComparePage(response)
157 153 compare_page.contains_change_summary(1, 2, 0)
158 154 compare_page.contains_commits([commit1, commit2])
159 compare_page.contains_file_links_and_anchors([
160 ('file1', 'a_c--826e8142e6ba'),
161 ])
155
156 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
157 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
162 158
163 159 # Swap is removed when comparing branches since it's a PR feature and
164 160 # it is then a preview mode
@@ -199,13 +195,11 b' class TestCompareView(object):'
199 195
200 196 response = self.app.get(
201 197 route_path('repo_compare',
202 repo_name=repo1.repo_name,
203 source_ref_type="branch",
204 source_ref=commit_id2,
205 target_ref_type="branch",
206 target_ref=commit_id1,
207 params=dict(merge='1', target_repo=repo2.repo_name),
208 ))
198 repo_name=repo1.repo_name,
199 source_ref_type="branch", source_ref=commit_id2,
200 target_ref_type="branch", target_ref=commit_id1,
201 params=dict(merge='1', target_repo=repo2.repo_name),
202 ))
209 203
210 204 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
211 205 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
@@ -213,9 +207,8 b' class TestCompareView(object):'
213 207 compare_page = ComparePage(response)
214 208 compare_page.contains_change_summary(1, 2, 0)
215 209 compare_page.contains_commits([commit1, commit2])
216 compare_page.contains_file_links_and_anchors([
217 ('file1', 'a_c--826e8142e6ba'),
218 ])
210 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
211 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
219 212
220 213 # Swap is removed when comparing branches since it's a PR feature and
221 214 # it is then a preview mode
@@ -230,13 +223,11 b' class TestCompareView(object):'
230 223
231 224 response = self.app.get(
232 225 route_path('repo_compare',
233 repo_name=orig.repo_name,
234 source_ref_type="rev",
235 source_ref="tip",
236 target_ref_type="rev",
237 target_ref="tip",
238 params=dict(merge='1', target_repo=fork.repo_name),
239 ),
226 repo_name=orig.repo_name,
227 source_ref_type="rev", source_ref="tip",
228 target_ref_type="rev", target_ref="tip",
229 params=dict(merge='1', target_repo=fork.repo_name),
230 ),
240 231 status=302)
241 232 response = response.follow()
242 233 response.mustcontain("Repositories unrelated.")
@@ -289,14 +280,12 b' class TestCompareView(object):'
289 280
290 281 response = self.app.get(
291 282 route_path('repo_compare',
292 repo_name=repo2.repo_name,
293 source_ref_type="rev",
294 # parent of commit2, in target repo2
295 source_ref=commit1.raw_id,
296 target_ref_type="rev",
297 target_ref=commit4.raw_id,
298 params=dict(merge='1', target_repo=repo1.repo_name),
299 ))
283 repo_name=repo2.repo_name,
284 # parent of commit2, in target repo2
285 source_ref_type="rev", source_ref=commit1.raw_id,
286 target_ref_type="rev", target_ref=commit4.raw_id,
287 params=dict(merge='1', target_repo=repo1.repo_name),
288 ))
300 289 response.mustcontain('%s@%s' % (repo2.repo_name, commit1.short_id))
301 290 response.mustcontain('%s@%s' % (repo1.repo_name, commit4.short_id))
302 291
@@ -304,9 +293,8 b' class TestCompareView(object):'
304 293 compare_page = ComparePage(response)
305 294 compare_page.contains_change_summary(1, 3, 0)
306 295 compare_page.contains_commits([commit2, commit3, commit4])
307 compare_page.contains_file_links_and_anchors([
308 ('file1', 'a_c--826e8142e6ba'),
309 ])
296 anchor = 'a_c-{}-826e8142e6ba'.format(commit1.short_id)
297 compare_page.contains_file_links_and_anchors([('file1', anchor),])
310 298
311 299 @pytest.mark.xfail_backends("svn")
312 300 def test_compare_cherry_pick_commits_from_top(self, backend):
@@ -355,14 +343,11 b' class TestCompareView(object):'
355 343
356 344 response = self.app.get(
357 345 route_path('repo_compare',
358 repo_name=repo1.repo_name,
359 source_ref_type="rev",
360 # parent of commit3, not in source repo2
361 source_ref=commit2.raw_id,
362 target_ref_type="rev",
363 target_ref=commit5.raw_id,
364 params=dict(merge='1'),
365 ))
346 repo_name=repo1.repo_name,
347 # parent of commit3, not in source repo2
348 source_ref_type="rev", source_ref=commit2.raw_id,
349 target_ref_type="rev", target_ref=commit5.raw_id,
350 params=dict(merge='1'),))
366 351
367 352 response.mustcontain('%s@%s' % (repo1.repo_name, commit2.short_id))
368 353 response.mustcontain('%s@%s' % (repo1.repo_name, commit5.short_id))
@@ -372,9 +357,8 b' class TestCompareView(object):'
372 357 compare_page.contains_commits([commit3, commit4, commit5])
373 358
374 359 # files
375 compare_page.contains_file_links_and_anchors([
376 ('file1', 'a_c--826e8142e6ba'),
377 ])
360 anchor = 'a_c-{}-826e8142e6ba'.format(commit2.short_id)
361 compare_page.contains_file_links_and_anchors([('file1', anchor),])
378 362
379 363 @pytest.mark.xfail_backends("svn")
380 364 def test_compare_remote_branches(self, backend):
@@ -382,17 +366,17 b' class TestCompareView(object):'
382 366 repo2 = backend.create_fork()
383 367
384 368 commit_id1 = repo1.get_commit(commit_idx=3).raw_id
369 commit_id1_short = repo1.get_commit(commit_idx=3).short_id
385 370 commit_id2 = repo1.get_commit(commit_idx=6).raw_id
371 commit_id2_short = repo1.get_commit(commit_idx=6).short_id
386 372
387 373 response = self.app.get(
388 374 route_path('repo_compare',
389 repo_name=repo1.repo_name,
390 source_ref_type="rev",
391 source_ref=commit_id1,
392 target_ref_type="rev",
393 target_ref=commit_id2,
394 params=dict(merge='1', target_repo=repo2.repo_name),
395 ))
375 repo_name=repo1.repo_name,
376 source_ref_type="rev", source_ref=commit_id1,
377 target_ref_type="rev", target_ref=commit_id2,
378 params=dict(merge='1', target_repo=repo2.repo_name),
379 ))
396 380
397 381 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id1))
398 382 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id2))
@@ -405,9 +389,9 b' class TestCompareView(object):'
405 389
406 390 # files
407 391 compare_page.contains_file_links_and_anchors([
408 ('vcs/backends/hg.py', 'a_c--9c390eb52cd6'),
409 ('vcs/backends/__init__.py', 'a_c--41b41c1f2796'),
410 ('vcs/backends/base.py', 'a_c--2f574d260608'),
392 ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(commit_id2_short)),
393 ('vcs/backends/__init__.py', 'a_c-{}-41b41c1f2796'.format(commit_id1_short)),
394 ('vcs/backends/base.py', 'a_c-{}-2f574d260608'.format(commit_id1_short)),
411 395 ])
412 396
413 397 @pytest.mark.xfail_backends("svn")
@@ -451,13 +435,11 b' class TestCompareView(object):'
451 435
452 436 response = self.app.get(
453 437 route_path('repo_compare',
454 repo_name=r2_name,
455 source_ref_type="branch",
456 source_ref=commit_id1,
457 target_ref_type="branch",
458 target_ref=commit_id2,
459 params=dict(merge='1', target_repo=r1_name),
460 ))
438 repo_name=r2_name,
439 source_ref_type="branch", source_ref=commit_id1,
440 target_ref_type="branch", target_ref=commit_id2,
441 params=dict(merge='1', target_repo=r1_name),
442 ))
461 443
462 444 response.mustcontain('%s@%s' % (r2_name, commit_id1))
463 445 response.mustcontain('%s@%s' % (r1_name, commit_id2))
@@ -472,13 +454,11 b' class TestCompareView(object):'
472 454 # compare !
473 455 response = self.app.get(
474 456 route_path('repo_compare',
475 repo_name=r2_name,
476 source_ref_type="branch",
477 source_ref=commit_id1,
478 target_ref_type="branch",
479 target_ref=commit_id2,
480 params=dict(merge='1', target_repo=r1_name),
481 ))
457 repo_name=r2_name,
458 source_ref_type="branch", source_ref=commit_id1,
459 target_ref_type="branch", target_ref=commit_id2,
460 params=dict(merge='1', target_repo=r1_name),
461 ))
482 462
483 463 response.mustcontain('%s@%s' % (r2_name, commit_id1))
484 464 response.mustcontain('%s@%s' % (r1_name, commit_id2))
@@ -495,14 +475,12 b' class TestCompareView(object):'
495 475
496 476 response = self.app.get(
497 477 route_path('repo_compare',
498 repo_name=backend.repo_name,
499 source_ref_type="rev",
500 source_ref=commit0.raw_id,
501 target_ref_type="rev",
502 target_ref=commit1.raw_id,
503 params=dict(merge='1')
504 ),
505 extra_environ=xhr_header,)
478 repo_name=backend.repo_name,
479 source_ref_type="rev", source_ref=commit0.raw_id,
480 target_ref_type="rev", target_ref=commit1.raw_id,
481 params=dict(merge='1')
482 ),
483 extra_environ=xhr_header, )
506 484
507 485 # outgoing commits between those commits
508 486 compare_page = ComparePage(response)
@@ -514,13 +492,11 b' class TestCompareView(object):'
514 492
515 493 response = self.app.get(
516 494 route_path('repo_compare',
517 repo_name=badrepo,
518 source_ref_type="rev",
519 source_ref='tip',
520 target_ref_type="rev",
521 target_ref='tip',
522 params=dict(merge='1', target_repo=repo.repo_name)
523 ),
495 repo_name=badrepo,
496 source_ref_type="rev", source_ref='tip',
497 target_ref_type="rev", target_ref='tip',
498 params=dict(merge='1', target_repo=repo.repo_name)
499 ),
524 500 status=404)
525 501
526 502 def test_errors_when_comparing_unknown_target_repo(self, backend):
@@ -529,13 +505,11 b' class TestCompareView(object):'
529 505
530 506 response = self.app.get(
531 507 route_path('repo_compare',
532 repo_name=repo.repo_name,
533 source_ref_type="rev",
534 source_ref='tip',
535 target_ref_type="rev",
536 target_ref='tip',
537 params=dict(merge='1', target_repo=badrepo),
538 ),
508 repo_name=repo.repo_name,
509 source_ref_type="rev", source_ref='tip',
510 target_ref_type="rev", target_ref='tip',
511 params=dict(merge='1', target_repo=badrepo),
512 ),
539 513 status=302)
540 514 redirected = response.follow()
541 515 redirected.mustcontain(
@@ -547,12 +521,10 b' class TestCompareView(object):'
547 521
548 522 response = self.app.get(
549 523 route_path('repo_compare',
550 repo_name=backend_stub.repo_name,
551 source_ref_type="rev",
552 source_ref=commit0.raw_id,
553 target_ref_type="rev",
554 target_ref=commit1.raw_id,
555 ))
524 repo_name=backend_stub.repo_name,
525 source_ref_type="rev", source_ref=commit0.raw_id,
526 target_ref_type="rev", target_ref=commit1.raw_id,
527 ))
556 528
557 529 # outgoing commits between those commits
558 530 compare_page = ComparePage(response)
@@ -575,13 +547,11 b' class TestCompareView(object):'
575 547
576 548 response = self.app.get(
577 549 route_path('repo_compare',
578 repo_name=orig.repo_name,
579 source_ref_type="rev",
580 source_ref="tip",
581 target_ref_type="rev",
582 target_ref="tip",
583 params=dict(merge='1', target_repo=fork.repo_name),
584 ),
550 repo_name=orig.repo_name,
551 source_ref_type="rev", source_ref="tip",
552 target_ref_type="rev", target_ref="tip",
553 params=dict(merge='1', target_repo=fork.repo_name),
554 ),
585 555 status=302)
586 556
587 557 assert_session_flash(
@@ -597,13 +567,13 b' class TestCompareControllerSvn(object):'
597 567 commit_id = repo.get_commit(commit_idx=-1).raw_id
598 568 response = app.get(
599 569 route_path('repo_compare',
600 repo_name=repo.repo_name,
601 source_ref_type="tag",
602 source_ref="%s@%s" % ('tags/v0.1', commit_id),
603 target_ref_type="tag",
604 target_ref="%s@%s" % ('tags/v0.2', commit_id),
605 params=dict(merge='1'),
606 ),
570 repo_name=repo.repo_name,
571 source_ref_type="tag",
572 source_ref="%s@%s" % ('tags/v0.1', commit_id),
573 target_ref_type="tag",
574 target_ref="%s@%s" % ('tags/v0.2', commit_id),
575 params=dict(merge='1'),
576 ),
607 577 status=200)
608 578
609 579 # Expecting no commits, since both paths are at the same revision
@@ -620,13 +590,13 b' class TestCompareControllerSvn(object):'
620 590 target_id = repo.get_commit(commit_idx=-1).raw_id
621 591 response = app.get(
622 592 route_path('repo_compare',
623 repo_name=repo.repo_name,
624 source_ref_type="tag",
625 source_ref="%s@%s" % ('tags/v0.1', source_id),
626 target_ref_type="tag",
627 target_ref="%s@%s" % ('tags/v0.2', target_id),
628 params=dict(merge='1')
629 ),
593 repo_name=repo.repo_name,
594 source_ref_type="tag",
595 source_ref="%s@%s" % ('tags/v0.1', source_id),
596 target_ref_type="tag",
597 target_ref="%s@%s" % ('tags/v0.2', target_id),
598 params=dict(merge='1')
599 ),
630 600 status=200)
631 601
632 602 # It should show commits
@@ -648,7 +618,7 b' class ComparePage(AssertResponse):'
648 618 for filename, file_id in files:
649 619 self.contains_one_anchor(file_id)
650 620 diffblock = doc.cssselect('[data-f-path="%s"]' % filename)
651 assert len(diffblock) == 1
621 assert len(diffblock) == 2
652 622 assert len(diffblock[0].cssselect('a[href="#%s"]' % file_id)) == 1
653 623
654 624 def contains_change_summary(self, files_changed, inserted, deleted):
@@ -694,4 +664,3 b' class ComparePage(AssertResponse):'
694 664 def target_source_are_enabled(self):
695 665 response = self.response
696 666 response.mustcontain("var enable_fields = true;")
697
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (823 lines changed) Show them Hide them
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now