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