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,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.1 |
|
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 = |
|
20 | state = in_progress | |
24 |
version = 4.1 |
|
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', |
|
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 |
## |
|
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 |
## |
|
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@ |
|
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 |
|
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 |
linkNode |
|
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 |
|
|
218 | ln -s ${self.supervisor}/bin/supervisorctl $out/bin/ | |
202 |
ln -s ${self. |
|
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 |
|
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: |
|
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 |
|
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 |
|
|
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- |
|
17 | :ref:`integrations-webhook` |RCCEshort| Trigger events as `json` to a custom url | |
18 |
:ref:`integrations- |
|
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- |
|
20 | :ref:`integrations-email` |RCCEshort| Send repo push commits by email | |
21 |
:ref:`integrations- |
|
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 |
|
57 | |||
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 |
" |
|
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 |
" |
|
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": " |
|
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 |
" |
|
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- |
|
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 |
# |
|
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. |
|
41 | drv.buildInputs or [] | |
42 |
drv.propagated |
|
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 |
|
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/ |
|
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- |
|
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 |
|
33 | ./patches/beaker/patch-beaker-lock-func-debug.diff | |
34 |
./patch |
|
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 |
|
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/a |
|
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. |
|
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 |
|
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- |
|
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 |
|
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. |
|
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. |
|
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/4 |
|
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. |
|
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/ |
|
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 |
"gr |
|
528 | "greenlet" = super.buildPythonPackage { | |
554 |
name = "gr |
|
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. |
|
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/ |
|
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. |
|
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/a |
|
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. |
|
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. |
|
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 |
|
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. |
|
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. |
|
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 |
|
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. |
|
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. |
|
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/ |
|
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. |
|
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/2 |
|
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 |
|
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/ |
|
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.1 |
|
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.1 |
|
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.1 |
|
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 = "A |
|
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. |
|
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/ |
|
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. |
|
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/ |
|
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. |
|
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/ |
|
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. |
|
7 | atomicwrites==1.2.1 | |
8 |
attrs==18. |
|
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. |
|
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. |
|
47 | pathlib2==2.3.2 | |
49 | peppercorn==0.5 |
|
48 | peppercorn==0.5 | |
50 |
psutil==5.4. |
|
49 | psutil==5.4.7 | |
51 |
psycopg2==2.7. |
|
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. |
|
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. |
|
115 | gevent==1.3.6 | |
117 |
greenlet==0.4.1 |
|
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.1 |
|
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. |
|
2 | pytest==3.8.2 | |
3 |
py==1. |
|
3 | py==1.6.0 | |
4 |
pytest-cov==2. |
|
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== |
|
14 | coverage==4.5.1 |
@@ -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__ = 9 |
|
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' |
|
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__( |
|
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_c |
|
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_c |
|
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 |
|
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 |
|
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 |
|
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 |
|
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= |
|
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 |
|
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 |
" |
|
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 |
|
525 | for license_data in sample_licenses: | |
510 |
response.mustcontain( |
|
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( |
|
114 | connect_result = channelstream_request( | |
112 | payload, '/connect') |
|
115 | self.channelstream_config, payload, '/connect') | |
113 | except ChannelstreamConnectionException: |
|
116 | except ChannelstreamConnectionException: | |
114 |
log.exception( |
|
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( |
|
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( |
|
175 | update_history_from_logs( | |
168 |
|
|
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 |
|
|
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(' |
|
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 |
|
|
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' |
|
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 |
|
|
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=" |
|
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=" |
|
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 |
|
|
163 | author, comment_type, f_path, h.show_id(commit), backend.repo_name) | |
157 | comment_type=comment_type) |
|
164 | ||
158 |
assert sbj |
|
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 |
|
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 |
|
|
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 |
|
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 |
|
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 |
|
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 |
|
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 [' |
|
303 | for elem in ['Hide whitespace changes', 'Toggle Wide Mode diff', | |
305 |
' |
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
552 | target_ref_type="rev", target_ref="tip", | |
581 | target_ref_type="rev", |
|
553 | params=dict(merge='1', target_repo=fork.repo_name), | |
582 |
|
|
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) == |
|
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