##// END OF EJS Templates
nix: updated to 18.03 nix packages...
marcink -
r2824:5ac461b5 default
parent child Browse files
Show More

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

@@ -0,0 +1,55 b''
1
2 ==============================
3 Generate the Nix expressions
4 ==============================
5
6 Details can be found in the repository of `RhodeCode Enterprise CE`_ inside of
7 the file `docs/contributing/dependencies.rst`.
8
9 Start the environment as follows:
10
11 .. code:: shell
12
13 nix-shell pkgs/shell-generate.nix
14
15
16
17 Python dependencies
18 ===================
19
20 .. code:: shell
21
22 pip2nix generate --licenses
23 # or
24 nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses"
25
26
27 NodeJS dependencies
28 ===================
29
30 .. code:: shell
31
32 # switch to pkgs dir
33 pushd pkgs
34 node2nix --input ../package.json \
35 -o node-packages.nix \
36 -e node-env.nix \
37 -c node-default.nix \
38 -d --flatten --nodejs-6
39 popd
40
41
42
43 Bower dependencies
44 ==================
45
46 .. code:: shell
47
48 bower2nix bower.json pkgs/bower-packages.nix
49 # or
50 nix-shell pkgs/shell-generate.nix --command "bower2nix bower.json pkgs/bower-packages.nix"
51
52
53 .. Links
54
55 .. _RhodeCode Enterprise CE: https://code.rhodecode.com/rhodecode-enterprise-ce
@@ -0,0 +1,17 b''
1 { pkgs
2 , pythonPackages
3 }:
4
5 rec {
6 pip2nix-src = pkgs.fetchzip {
7 url = https://github.com/johbo/pip2nix/archive/51e6fdae34d0e8ded9efeef7a8601730249687a6.tar.gz;
8 sha256 = "02a4jjgi7lsvf8mhrxsd56s9a3yg20081rl9bgc2m84w60v2gbz2";
9 };
10
11 pip2nix = import pip2nix-src {
12 inherit
13 pkgs
14 pythonPackages;
15 };
16
17 }
@@ -0,0 +1,52 b''
1 { pkgs ? (import <nixpkgs> {})
2 , pythonPackages ? "python27Packages"
3 }:
4
5 with pkgs.lib;
6
7 let _pythonPackages = pythonPackages; in
8 let
9 pythonPackages = getAttr _pythonPackages pkgs;
10
11 pip2nix = import ./nix-common/pip2nix.nix {
12 inherit
13 pkgs
14 pythonPackages;
15 };
16
17 in
18
19 pkgs.stdenv.mkDerivation {
20 name = "pip2nix-generated";
21 buildInputs = [
22 # Allows to generate python packages
23 pip2nix.pip2nix
24 pythonPackages.pip-tools
25
26 # Allows to generate bower dependencies
27 pkgs.nodePackages.bower2nix
28
29 # Allows to generate node dependencies
30 pkgs.nodePackages.node2nix
31
32 # We need mysql_config to be around
33 pkgs.mysql
34
35 # We need postgresql to be around
36 pkgs.postgresql
37
38 # Curl is needed for pycurl
39 pkgs.curl
40 ];
41
42 shellHook = ''
43 runHook preShellHook
44 runHook postShellHook
45 '';
46
47 preShellHook = ''
48 echo "Starting Generate Shell"
49 # Custom prompt to distinguish from other dev envs.
50 export PS1="\n\[\033[1;32m\][Generate-shell:\w]$\[\033[0m\] "
51 '';
52 }
@@ -1,17 +1,17 b''
1 1 {
2 2 "name": "rhodecode-elements",
3 3 "description": "User interface for elements for rhodecode",
4 4 "main": "index.html",
5 5 "dependencies": {
6 6 "webcomponentsjs": "^0.7.22",
7 7 "polymer": "Polymer/polymer#^1.6.1",
8 8 "paper-button": "PolymerElements/paper-button#^1.0.13",
9 9 "paper-spinner": "PolymerElements/paper-spinner#^1.2.0",
10 10 "paper-tooltip": "PolymerElements/paper-tooltip#^1.1.2",
11 11 "paper-toast": "PolymerElements/paper-toast#^1.3.0",
12 12 "paper-toggle-button": "PolymerElements/paper-toggle-button#^1.2.0",
13 "iron-ajax": "PolymerElements/iron-ajax#^1.4.3",
13 "iron-ajax": "PolymerElements/iron-ajax#^1.4.4",
14 14 "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#^1.0.13",
15 15 "iron-a11y-keys": "PolymerElements/iron-a11y-keys#^1.0.6"
16 16 }
17 17 }
@@ -1,243 +1,258 b''
1 1 # Nix environment for the community edition
2 2 #
3 # This shall be as lean as possible, just producing the Enterprise
3 # This shall be as lean as possible, just producing the enterprise-ce
4 4 # derivation. For advanced tweaks to pimp up the development environment we use
5 5 # "shell.nix" so that it does not have to clutter this file.
6 #
7 # Configuration, set values in "~/.nixpkgs/config.nix".
8 # example
9 # {
10 # # Thoughts on how to configure the dev environment
11 # rc = {
12 # codeInternalUrl = "https://usr:token@internal-code.rhodecode.com";
13 # sources = {
14 # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver";
15 # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce";
16 # rhodecode-enterprise-ee = "/home/user/work/rhodecode-enterprise-ee";
17 # };
18 # };
19 # }
6 20
7 21 args@
8 22 { pythonPackages ? "python27Packages"
9 23 , pythonExternalOverrides ? self: super: {}
10 , doCheck ? true
24 , doCheck ? false
11 25 , ...
12 26 }:
13 27
14 28 let
15
16 29 # Use nixpkgs from args or import them. We use this indirect approach
17 30 # through args to be able to use the name `pkgs` for our customized packages.
18 31 # Otherwise we will end up with an infinite recursion.
19 nixpkgs = args.pkgs or (import <nixpkgs> { });
32 pkgs = args.pkgs or (import <nixpkgs> { });
20 33
21 # johbo: Interim bridge which allows us to build with the upcoming
22 # nixos.16.09 branch (unstable at the moment of writing this note) and the
23 # current stable nixos-16.03.
24 backwardsCompatibleFetchgit = { ... }@args:
25 let
26 origSources = nixpkgs.fetchgit args;
27 in
28 nixpkgs.lib.overrideDerivation origSources (oldAttrs: {
29 NIX_PREFETCH_GIT_CHECKOUT_HOOK = ''
30 find $out -name '.git*' -print0 | xargs -0 rm -rf
31 '';
32 });
33
34 # Create a customized version of nixpkgs which should be used throughout the
35 # rest of this file.
36 pkgs = nixpkgs.overridePackages (self: super: {
37 fetchgit = backwardsCompatibleFetchgit;
38 });
34 # Works with the new python-packages, still can fallback to the old
35 # variant.
36 basePythonPackagesUnfix = basePythonPackages.__unfix__ or (
37 self: basePythonPackages.override (a: { inherit self; }));
39 38
40 39 # Evaluates to the last segment of a file system path.
41 40 basename = path: with pkgs.lib; last (splitString "/" path);
42 41
43 42 # source code filter used as arugment to builtins.filterSource.
44 43 src-filter = path: type: with pkgs.lib;
45 44 let
46 45 ext = last (splitString "." path);
47 46 in
48 47 !builtins.elem (basename path) [
49 ".git" ".hg" "__pycache__" ".eggs"
48 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
50 49 "bower_components" "node_modules"
51 50 "build" "data" "result" "tmp"] &&
52 51 !builtins.elem ext ["egg-info" "pyc"] &&
53 52 # TODO: johbo: This check is wrong, since "path" contains an absolute path,
54 53 # it would still be good to restore it since we want to ignore "result-*".
55 54 !hasPrefix "result" path;
56 55
57 basePythonPackages = with builtins; if isAttrs pythonPackages
58 then pythonPackages
59 else getAttr pythonPackages pkgs;
56 sources =
57 let
58 inherit (pkgs.lib) all isString attrValues;
59 sourcesConfig = pkgs.config.rc.sources or {};
60 in
61 # Ensure that sources are configured as strings. Using a path
62 # would result in a copy into the nix store.
63 assert all isString (attrValues sourcesConfig);
64 sourcesConfig;
60 65
61 buildBowerComponents =
62 pkgs.buildBowerComponents or
63 (import ./pkgs/backport-16.03-build-bower-components.nix { inherit pkgs; });
64
65 sources = pkgs.config.rc.sources or {};
66 version = builtins.readFile ./rhodecode/VERSION;
66 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
67 67 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
68 68
69 buildBowerComponents = pkgs.buildBowerComponents;
69 70 nodeEnv = import ./pkgs/node-default.nix {
70 71 inherit pkgs;
71 72 };
72 73 nodeDependencies = nodeEnv.shell.nodeDependencies;
73 74
74 75 bowerComponents = buildBowerComponents {
75 76 name = "enterprise-ce-${version}";
76 77 generated = ./pkgs/bower-packages.nix;
77 78 src = rhodecode-enterprise-ce-src;
78 79 };
79 80
80 pythonGeneratedPackages = self: basePythonPackages.override (a: {
81 inherit self;
82 })
83 // (scopedImport {
84 self = self;
85 super = basePythonPackages;
86 inherit pkgs;
87 inherit (pkgs) fetchurl fetchgit;
88 } ./pkgs/python-packages.nix);
81 rhodecode-testdata-src = sources.rhodecode-testdata or (
82 pkgs.fetchhg {
83 url = "https://code.rhodecode.com/upstream/rc_testdata";
84 rev = "v0.10.0";
85 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
86 });
89 87
90 pythonOverrides = import ./pkgs/python-packages-overrides.nix {
91 inherit
92 basePythonPackages
93 pkgs;
88 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
89 inherit
90 doCheck
91 pkgs
92 pythonPackages;
94 93 };
95 94
96 95 pythonLocalOverrides = self: super: {
97 96 rhodecode-enterprise-ce =
98 97 let
99 98 linkNodeAndBowerPackages = ''
100 echo "Export RhodeCode CE path"
101 99 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
102 echo "Link node packages"
100
101 echo "[BEGIN]: Link node packages"
103 102 rm -fr node_modules
104 103 mkdir node_modules
105 104 # johbo: Linking individual packages allows us to run "npm install"
106 105 # inside of a shell to try things out. Re-entering the shell will
107 106 # restore a clean environment.
108 107 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
108 echo "[DONE]: Link node packages"
109 109
110 echo "DONE: Link node packages"
111
112 echo "Link bower packages"
110 echo "[BEGIN]: Link bower packages"
113 111 rm -fr bower_components
114 112 mkdir bower_components
113 ln -s ${bowerComponents}/bower_components/* bower_components/
114 echo "[DONE]: Link bower packages"
115 '';
115 116
116 ln -s ${bowerComponents}/bower_components/* bower_components/
117 echo "DONE: Link bower packages"
118 '';
117 releaseName = "RhodeCodeEnterpriseCE-${version}";
119 118 in super.rhodecode-enterprise-ce.override (attrs: {
120
121 119 inherit
122 120 doCheck
123 121 version;
122
124 123 name = "rhodecode-enterprise-ce-${version}";
125 releaseName = "RhodeCodeEnterpriseCE-${version}";
124 releaseName = releaseName;
126 125 src = rhodecode-enterprise-ce-src;
127 126 dontStrip = true; # prevent strip, we don't need it.
128 127
129 buildInputs =
130 attrs.buildInputs ++
131 (with self; [
132 pkgs.nodePackages.bower
133 pkgs.nodePackages.grunt-cli
134 pkgs.subversion
135 rhodecode-testdata
136 ]);
137
138 #TODO: either move this into overrides, OR use the new machanics from
139 # pip2nix and requiremtn.txt file
140 propagatedBuildInputs = attrs.propagatedBuildInputs ++ (with self; [
141 rhodecode-tools
142 ]);
143
144 # TODO: johbo: Make a nicer way to expose the parts. Maybe
145 # pkgs/default.nix?
128 # expose following attributed outside
146 129 passthru = {
147 130 inherit
131 rhodecode-testdata
148 132 bowerComponents
149 133 linkNodeAndBowerPackages
150 134 myPythonPackagesUnfix
151 pythonLocalOverrides;
135 pythonLocalOverrides
136 pythonCommunityOverrides;
137
152 138 pythonPackages = self;
153 139 };
154 140
141 buildInputs =
142 attrs.buildInputs or [] ++ [
143 rhodecode-testdata
144 pkgs.nodePackages.bower
145 pkgs.nodePackages.grunt-cli
146 ];
147
148 #NOTE: option to inject additional propagatedBuildInputs
149 propagatedBuildInputs =
150 attrs.propagatedBuildInputs or [] ++ [
151
152 ];
153
155 154 LC_ALL = "en_US.UTF-8";
156 155 LOCALE_ARCHIVE =
157 if pkgs.stdenv ? glibc
156 if pkgs.stdenv.isLinux
158 157 then "${pkgs.glibcLocales}/lib/locale/locale-archive"
159 158 else "";
160 159
160 # Add bin directory to path so that tests can find 'rhodecode'.
161 161 preCheck = ''
162 162 export PATH="$out/bin:$PATH"
163 163 '';
164 164
165 # custom check phase for testing
166 checkPhase = ''
167 runHook preCheck
168 PYTHONHASHSEED=random py.test -vv -p no:sugar -r xw --cov-config=.coveragerc --cov=rhodecode --cov-report=term-missing rhodecode
169 runHook postCheck
170 '';
171
165 172 postCheck = ''
166 rm -rf $out/lib/${self.python.libPrefix}/site-packages/pytest_pylons
173 echo "Cleanup of rhodecode/tests"
167 174 rm -rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/tests
168 175 '';
169 176
170 preBuild = linkNodeAndBowerPackages + ''
177 preBuild = ''
178
179 echo "Building frontend assets"
180 ${linkNodeAndBowerPackages}
171 181 grunt
172 182 rm -fr node_modules
173 183 '';
174 184
175 185 postInstall = ''
176 echo "Writing meta information for rccontrol to nix-support/rccontrol"
186 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
177 187 mkdir -p $out/nix-support/rccontrol
178 188 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
179 echo "DONE: Meta information for rccontrol written"
189 echo "[DONE]: enterprise-ce meta information for rccontrol written"
190
191 mkdir -p $out/etc
192 cp configs/production.ini $out/etc
193 echo "[DONE]: saved enterprise-ce production.ini into $out/etc"
180 194
181 195 # python based programs need to be wrapped
182 #ln -s ${self.python}/bin/* $out/bin/
196 mkdir -p $out/bin
197 # rhodecode-tools
198 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
199
200 # required binaries from dependencies
201 #ln -s ${self.python}/bin/python $out/bin
183 202 ln -s ${self.pyramid}/bin/* $out/bin/
184 203 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
185 204 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
186 205 ln -s ${self.pastescript}/bin/paster $out/bin/
187 206 ln -s ${self.channelstream}/bin/channelstream $out/bin/
188 207 ln -s ${self.celery}/bin/celery $out/bin/
208 echo "[DONE]: created symlinks into $out/bin"
189 209
190 # rhodecode-tools
191 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
192
193 # note that condition should be restricted when adding further tools
194 210 for file in $out/bin/*;
195 211 do
196 212 wrapProgram $file \
197 --prefix PATH : $PATH \
198 --prefix PYTHONPATH : $PYTHONPATH \
199 --set PYTHONHASHSEED random
213 --prefix PATH : $PATH \
214 --prefix PYTHONPATH : $PYTHONPATH \
215 --set PYTHONHASHSEED random
200 216 done
201 217
202 mkdir $out/etc
203 cp configs/production.ini $out/etc
218 echo "[DONE]: enterprise-ce binary wrapping"
204 219
205
206 # TODO: johbo: Make part of ac-tests
207 220 if [ ! -f rhodecode/public/js/scripts.js ]; then
208 221 echo "Missing scripts.js"
209 222 exit 1
210 223 fi
211 224 if [ ! -f rhodecode/public/css/style.css ]; then
212 225 echo "Missing style.css"
213 226 exit 1
214 227 fi
215 228 '';
216
217 229 });
218 230
219 rhodecode-testdata = import "${rhodecode-testdata-src}/default.nix" {
220 inherit
221 doCheck
222 pkgs
223 pythonPackages;
224 };
225
226 231 };
227 232
228 rhodecode-testdata-src = sources.rhodecode-testdata or (
229 pkgs.fetchhg {
230 url = "https://code.rhodecode.com/upstream/rc_testdata";
231 rev = "v0.10.0";
232 sha256 = "0zn9swwvx4vgw4qn8q3ri26vvzgrxn15x6xnjrysi1bwmz01qjl0";
233 });
233 basePythonPackages = with builtins;
234 if isAttrs pythonPackages then
235 pythonPackages
236 else
237 getAttr pythonPackages pkgs;
238
239 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
240 inherit pkgs;
241 inherit (pkgs) fetchurl fetchgit fetchhg;
242 };
243
244 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
245 inherit pkgs basePythonPackages;
246 };
234 247
235 248 # Apply all overrides and fix the final package set
236 249 myPythonPackagesUnfix = with pkgs.lib;
237 250 (extends pythonExternalOverrides
238 251 (extends pythonLocalOverrides
239 (extends pythonOverrides
240 pythonGeneratedPackages)));
252 (extends pythonCommunityOverrides
253 (extends pythonGeneratedPackages
254 basePythonPackagesUnfix))));
255
241 256 myPythonPackages = (pkgs.lib.fix myPythonPackagesUnfix);
242 257
243 258 in myPythonPackages.rhodecode-enterprise-ce
@@ -1,226 +1,226 b''
1 1 .. _dev-setup:
2 2
3 3 ===================
4 4 Development setup
5 5 ===================
6 6
7 7
8 8 RhodeCode Enterprise runs inside a Nix managed environment. This ensures build
9 9 environment dependencies are correctly declared and installed during setup.
10 10 It also enables atomic upgrades, rollbacks, and multiple instances of RhodeCode
11 11 Enterprise running with isolation.
12 12
13 13 To set up RhodeCode Enterprise inside the Nix environment, use the following steps:
14 14
15 15
16 16
17 17 Setup Nix Package Manager
18 18 -------------------------
19 19
20 20 To install the Nix Package Manager, please run::
21 21
22 22 $ curl https://nixos.org/nix/install | sh
23 23
24 24 or go to https://nixos.org/nix/ and follow the installation instructions.
25 25 Once this is correctly set up on your system, you should be able to use the
26 26 following commands:
27 27
28 28 * `nix-env`
29 29
30 30 * `nix-shell`
31 31
32 32
33 33 .. tip::
34 34
35 35 Update your channels frequently by running ``nix-channel --update``.
36 36
37 37 .. note::
38 38
39 39 To uninstall nix run the following:
40 40
41 41 remove the . "$HOME/.nix-profile/etc/profile.d/nix.sh" line in your ~/.profile or ~/.bash_profile
42 42 rm -rf $HOME/{.nix-channels,.nix-defexpr,.nix-profile,.config/nixpkgs}
43 43 sudo rm -rf /nix
44 44
45 45 Switch nix to the latest STABLE channel
46 46 ---------------------------------------
47 47
48 48 run::
49 49
50 nix-channel --add https://nixos.org/channels/nixos-16.03 nixpkgs
50 nix-channel --add https://nixos.org/channels/nixos-18.03 nixpkgs
51 51
52 52 Followed by::
53 53
54 54 nix-channel --update
55 55
56 56
57 57 Install required binaries
58 58 -------------------------
59 59
60 60 We need some handy tools first.
61 61
62 62 run::
63 63
64 64 nix-env -i nix-prefetch-hg
65 65 nix-env -i nix-prefetch-git
66 66
67 67
68 68 Clone the required repositories
69 69 -------------------------------
70 70
71 71 After Nix is set up, clone the RhodeCode Enterprise Community Edition and
72 72 RhodeCode VCSServer repositories into the same directory.
73 73 RhodeCode currently is using Mercurial Version Control System, please make sure
74 74 you have it installed before continuing.
75 75
76 76 To obtain the required sources, use the following commands::
77 77
78 78 mkdir rhodecode-develop && cd rhodecode-develop
79 79 hg clone https://code.rhodecode.com/rhodecode-enterprise-ce
80 80 hg clone https://code.rhodecode.com/rhodecode-vcsserver
81 81
82 82 .. note::
83 83
84 84 If you cannot clone the repository, please contact us via support@rhodecode.com
85 85
86 86
87 87 Install some required libraries
88 88 -------------------------------
89 89
90 90 There are some required drivers and dev libraries that we need to install to
91 91 test RhodeCode under different types of databases. For example in Ubuntu we
92 92 need to install the following.
93 93
94 94 required libraries::
95 95
96 96 sudo apt-get install libapr1-dev libaprutil1-dev
97 97 sudo apt-get install libsvn-dev
98 98 sudo apt-get install mysql-server libmysqlclient-dev
99 99 sudo apt-get install postgresql postgresql-contrib libpq-dev
100 100 sudo apt-get install libcurl4-openssl-dev
101 101
102 102
103 103 Enter the Development Shell
104 104 ---------------------------
105 105
106 106 The final step is to start the development shells. To do this, run the
107 107 following command from inside the cloned repository::
108 108
109 109 #first, the vcsserver
110 110 cd ~/rhodecode-vcsserver
111 111 nix-shell
112 112
113 113 # then enterprise sources
114 114 cd ~/rhodecode-enterprise-ce
115 115 nix-shell
116 116
117 117 .. note::
118 118
119 119 On the first run, this will take a while to download and optionally compile
120 120 a few things. The following runs will be faster. The development shell works
121 121 fine on both MacOS and Linux platforms.
122 122
123 123
124 124 Create config.nix for development
125 125 ---------------------------------
126 126
127 127 In order to run proper tests and setup linking across projects, a config.nix
128 128 file needs to be setup::
129 129
130 130 # create config
131 131 mkdir -p ~/.nixpkgs
132 132 touch ~/.nixpkgs/config.nix
133 133
134 134 # put the below content into the ~/.nixpkgs/config.nix file
135 135 # adjusts, the path to where you cloned your repositories.
136 136
137 137 {
138 138 rc = {
139 139 sources = {
140 140 rhodecode-vcsserver = "/home/dev/rhodecode-vcsserver";
141 141 rhodecode-enterprise-ce = "/home/dev/rhodecode-enterprise-ce";
142 142 rhodecode-enterprise-ee = "/home/dev/rhodecode-enterprise-ee";
143 143 };
144 144 };
145 145 }
146 146
147 147
148 148
149 149 Creating a Development Configuration
150 150 ------------------------------------
151 151
152 152 To create a development environment for RhodeCode Enterprise,
153 153 use the following steps:
154 154
155 155 1. Create a copy of vcsserver config:
156 156 `cp ~/rhodecode-vcsserver/configs/development.ini ~/rhodecode-vcsserver/configs/dev.ini`
157 157 2. Create a copy of rhodocode config:
158 158 `cp ~/rhodecode-enterprise-ce/configs/development.ini ~/rhodecode-enterprise-ce/configs/dev.ini`
159 159 3. Adjust the configuration settings to your needs if needed.
160 160
161 161 .. note::
162 162
163 163 It is recommended to use the name `dev.ini` since it's included in .hgignore file.
164 164
165 165
166 166 Setup the Development Database
167 167 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
168 168
169 169 To create a development database, use the following example. This is a one
170 170 time operation executed from the nix-shell of rhodecode-enterprise-ce sources ::
171 171
172 172 rc-setup-app dev.ini \
173 173 --user=admin --password=secret \
174 174 --email=admin@example.com \
175 175 --repos=~/my_dev_repos
176 176
177 177
178 178 Compile CSS and JavaScript
179 179 ^^^^^^^^^^^^^^^^^^^^^^^^^^
180 180
181 181 To use the application's frontend and prepare it for production deployment,
182 182 you will need to compile the CSS and JavaScript with Grunt.
183 183 This is easily done from within the nix-shell using the following command::
184 184
185 185 grunt
186 186
187 187 When developing new features you will need to recompile following any
188 188 changes made to the CSS or JavaScript files when developing the code::
189 189
190 190 grunt watch
191 191
192 192 This prepares the development (with comments/whitespace) versions of files.
193 193
194 194 Start the Development Servers
195 195 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
196 196
197 197 From the rhodecode-vcsserver directory, start the development server in another
198 198 nix-shell, using the following command::
199 199
200 200 pserve configs/dev.ini
201 201
202 202 In the adjacent nix-shell which you created for your development server, you may
203 203 now start CE with the following command::
204 204
205 205
206 206 pserve --reload configs/dev.ini
207 207
208 208 .. note::
209 209
210 210 `--reload` flag will automatically reload the server when source file changes.
211 211
212 212
213 213 Run the Environment Tests
214 214 ^^^^^^^^^^^^^^^^^^^^^^^^^
215 215
216 216 Please make sure that the tests are passing to verify that your environment is
217 217 set up correctly. RhodeCode uses py.test to run tests.
218 218 While your instance is running, start a new nix-shell and simply run
219 219 ``make test`` to run the basic test suite.
220 220
221 221
222 222 Need Help?
223 223 ^^^^^^^^^^
224 224
225 225 Join us on Slack via https://rhodecode.com/join or post questions in our
226 226 Community Portal at https://community.rhodecode.com
@@ -1,25 +1,32 b''
1 1 {
2 2 "name": "rhodecode-enterprise",
3 "version": "0.0.1",
3 "version": "1.0.0",
4 "private": true,
5 "description" : "RhodeCode JS packaged",
6 "license": "SEE LICENSE IN LICENSE.txt",
7 "repository" : {
8 "type" : "hg",
9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 },
4 11 "devDependencies": {
5 12 "grunt": "^0.4.5",
6 13 "grunt-contrib-copy": "^1.0.0",
7 14 "grunt-contrib-concat": "^0.5.1",
8 15 "grunt-contrib-jshint": "^0.12.0",
9 16 "grunt-contrib-less": "^1.1.0",
10 17 "grunt-contrib-watch": "^0.6.1",
11 18 "crisper": "^2.0.2",
12 19 "vulcanize": "^1.14.8",
13 20 "grunt-crisper": "^1.0.1",
14 21 "grunt-vulcanize": "^1.0.0",
15 22 "node2nix": "^1.0.0",
16 23 "jshint": "^2.9.1-rc3",
17 "bower": "^1.7.9",
24 "bower": "^1.8.4",
18 25 "jquery": "1.11.3",
19 26 "favico.js": "^0.3.10",
20 27 "clipboard": "^1.7.1",
21 28 "moment": "^2.18.1",
22 29 "mousetrap": "^1.6.1",
23 30 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
24 31 }
25 32 }
@@ -1,33 +1,34 b''
1 # Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
1 2 { fetchbower, buildEnv }:
2 3 buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
3 (fetchbower "webcomponentsjs" "0.7.22" "^0.7.22" "0ggh3k8ssafd056ib1m5bvzi7cpz3ry7gr5176d79na1w0c3i7dz")
4 (fetchbower "polymer" "Polymer/polymer#1.6.1" "Polymer/polymer#^1.6.1" "09mm0jgk457gvwqlc155swch7gjr6fs3g7spnvhi6vh5b6518540")
5 (fetchbower "paper-button" "PolymerElements/paper-button#1.0.13" "PolymerElements/paper-button#^1.0.13" "0i3y153nqk06pn0gk282vyybnl3g1w3w41d5i9z659cgn27g3fvm")
6 (fetchbower "paper-spinner" "PolymerElements/paper-spinner#1.2.0" "PolymerElements/paper-spinner#^1.2.0" "1av1m6y81jw3hjhz1yqy3rwcgxarjzl58ldfn4q6sn51pgzngfqb")
7 (fetchbower "paper-tooltip" "PolymerElements/paper-tooltip#1.1.3" "PolymerElements/paper-tooltip#^1.1.2" "0vmrm1n8k9sk9nvqy03q177axy22pia6i3j1gxbk72j3pqiqvg6k")
8 (fetchbower "paper-toast" "PolymerElements/paper-toast#1.3.0" "PolymerElements/paper-toast#^1.3.0" "0x9rqxsks5455s8pk4aikpp99ijdn6kxr9gvhwh99nbcqdzcxq1m")
9 (fetchbower "paper-toggle-button" "PolymerElements/paper-toggle-button#1.2.0" "PolymerElements/paper-toggle-button#^1.2.0" "0mphcng3ngspbpg4jjn0mb91nvr4xc1phq3qswib15h6sfww1b2w")
10 (fetchbower "iron-ajax" "PolymerElements/iron-ajax#1.4.4" "PolymerElements/iron-ajax#^1.4.4" "0jpi7ik3zljw8yh2ccc85r26lcpzmkc2nl1kn6fqdx57zkzk9v5b")
11 (fetchbower "iron-autogrow-textarea" "PolymerElements/iron-autogrow-textarea#1.0.13" "PolymerElements/iron-autogrow-textarea#^1.0.13" "0zwhpl97vii1s8k0lgain8i9dnw29b0mxc5ixdscx9las13n2lqq")
12 (fetchbower "iron-a11y-keys" "PolymerElements/iron-a11y-keys#1.0.6" "PolymerElements/iron-a11y-keys#^1.0.6" "1xz3mgghfcxixq28sdb654iaxj4nyi1bzcwf77ydkms6fviqs9mv")
13 (fetchbower "iron-flex-layout" "PolymerElements/iron-flex-layout#1.3.1" "PolymerElements/iron-flex-layout#^1.0.0" "0nswv3ih3bhflgcd2wjfmddqswzgqxb2xbq65jk9w3rkj26hplbl")
14 (fetchbower "paper-behaviors" "PolymerElements/paper-behaviors#1.0.12" "PolymerElements/paper-behaviors#^1.0.0" "012bqk97awgz55cn7rm9g7cckrdhkqhls3zvp8l6nd4rdwcrdzq8")
15 (fetchbower "paper-material" "PolymerElements/paper-material#1.0.6" "PolymerElements/paper-material#^1.0.0" "0rljmknfdbm5aabvx9pk77754zckj3l127c3mvnmwkpkkr353xnh")
16 (fetchbower "paper-styles" "PolymerElements/paper-styles#1.1.4" "PolymerElements/paper-styles#^1.0.0" "0j8vg74xrcxlni8i93dsab3y80f34kk30lv4yblqpkp9c3nrilf7")
17 (fetchbower "neon-animation" "PolymerElements/neon-animation#1.2.4" "PolymerElements/neon-animation#^1.0.0" "16mz9i2n5w0k5j8d6gha23cnbdgm5syz3fawyh89gdbq97bi2q5j")
18 (fetchbower "iron-a11y-announcer" "PolymerElements/iron-a11y-announcer#1.0.5" "PolymerElements/iron-a11y-announcer#^1.0.0" "0n7c7j1pwk3835s7s2jd9125wdcsqf216yi5gj07wn5s8h8p7m9d")
19 (fetchbower "iron-overlay-behavior" "PolymerElements/iron-overlay-behavior#1.8.6" "PolymerElements/iron-overlay-behavior#^1.0.9" "14brn9gz6qqskarg3fxk91xs7vg02vgcsz9a9743kidxr0l0413m")
20 (fetchbower "iron-fit-behavior" "PolymerElements/iron-fit-behavior#1.2.5" "PolymerElements/iron-fit-behavior#^1.1.0" "1msnlh8lp1xg6v4h6dkjwj9kzac5q5q208ayla3x9hi483ki6rlf")
21 (fetchbower "iron-checked-element-behavior" "PolymerElements/iron-checked-element-behavior#1.0.5" "PolymerElements/iron-checked-element-behavior#^1.0.0" "0l0yy4ah454s8bzfv076s8by7h67zy9ni6xb932qwyhx8br6c1m7")
22 (fetchbower "promise-polyfill" "polymerlabs/promise-polyfill#1.0.1" "polymerlabs/promise-polyfill#^1.0.0" "045bj2caav3famr5hhxgs1dx7n08r4s46mlzwb313vdy17is38xb")
23 (fetchbower "iron-behaviors" "PolymerElements/iron-behaviors#1.0.17" "PolymerElements/iron-behaviors#^1.0.0" "021qvkmbk32jrrmmphpmwgby4bzi5jyf47rh1bxmq2ip07ly4bpr")
24 (fetchbower "iron-validatable-behavior" "PolymerElements/iron-validatable-behavior#1.1.1" "PolymerElements/iron-validatable-behavior#^1.0.0" "1yhxlvywhw2klbbgm3f3cmanxfxggagph4ii635zv0c13707wslv")
25 (fetchbower "iron-form-element-behavior" "PolymerElements/iron-form-element-behavior#1.0.6" "PolymerElements/iron-form-element-behavior#^1.0.0" "0rdhxivgkdhhz2yadgdbjfc70l555p3y83vjh8rfj5hr0asyn6q1")
26 (fetchbower "iron-a11y-keys-behavior" "polymerelements/iron-a11y-keys-behavior#1.1.9" "polymerelements/iron-a11y-keys-behavior#^1.0.0" "1imm4gc84qizihhbyhfa8lwjh3myhj837f79i5m04xjgwrjmkaf6")
27 (fetchbower "paper-ripple" "PolymerElements/paper-ripple#1.0.8" "PolymerElements/paper-ripple#^1.0.0" "0r9sq8ik7wwrw0qb82c3rw0c030ljwd3s466c9y4qbcrsbvfjnns")
28 (fetchbower "font-roboto" "PolymerElements/font-roboto#1.0.1" "PolymerElements/font-roboto#^1.0.1" "02jz43r0wkyr3yp7rq2rc08l5cwnsgca9fr54sr4rhsnl7cjpxrj")
29 (fetchbower "iron-meta" "PolymerElements/iron-meta#1.1.2" "PolymerElements/iron-meta#^1.0.0" "1wl4dx8fnsknw9z9xi8bpc4cy9x70c11x4zxwxnj73hf3smifppl")
30 (fetchbower "iron-resizable-behavior" "PolymerElements/iron-resizable-behavior#1.0.5" "PolymerElements/iron-resizable-behavior#^1.0.0" "1fd5zmbr2hax42vmcasncvk7lzi38fmb1kyii26nn8pnnjak7zkn")
31 (fetchbower "iron-selector" "PolymerElements/iron-selector#1.5.2" "PolymerElements/iron-selector#^1.0.0" "1ajv46llqzvahm5g6g75w7nfyjcslp53ji0wm96l2k94j87spv3r")
32 (fetchbower "web-animations-js" "web-animations/web-animations-js#2.2.2" "web-animations/web-animations-js#^2.2.0" "1izfvm3l67vwys0bqbhidi9rqziw2f8wv289386sc6jsxzgkzhga")
4 (fetchbower "webcomponentsjs" "0.7.24" "^0.7.22" "0d6hfsd51n7qykzci9cw5vlsrajvffaf5ic3azlp2rfz76m651qj")
5 (fetchbower "polymer" "Polymer/polymer#1.11.3" "Polymer/polymer#^1.6.1" "0n11ag2pmczw5yv3m76bh0a7hvicqvcaiv7knixx1r704pw107s6")
6 (fetchbower "paper-button" "PolymerElements/paper-button#1.0.15" "PolymerElements/paper-button#^1.0.13" "0zabrp8p4s9md1hlwg0rqmbx0k87a41lsg9pzk747hcb349gblg0")
7 (fetchbower "paper-spinner" "PolymerElements/paper-spinner#1.2.1" "PolymerElements/paper-spinner#^1.2.0" "0d6xc9fd2ipcli7w77yrn1k0z9j373c9y1f16db2840cyb4rvii8")
8 (fetchbower "paper-tooltip" "PolymerElements/paper-tooltip#1.1.4" "PolymerElements/paper-tooltip#^1.1.2" "0j8s09dxqql8mgnvb7x382scq98xk2vjgylk06bsd1gphp3d3qzm")
9 (fetchbower "paper-toast" "PolymerElements/paper-toast#1.3.1" "PolymerElements/paper-toast#^1.3.0" "1s0csv8dwgdyg4psq1zrd6vivlpsgzi4sjqllwqmlwhfnxfl5ql4")
10 (fetchbower "paper-toggle-button" "PolymerElements/paper-toggle-button#1.3.0" "PolymerElements/paper-toggle-button#^1.2.0" "0hvv2y406lzlrkkcmv9nnd99bmcgcrhcx86q3axxv8k3580gqq97")
11 (fetchbower "iron-ajax" "PolymerElements/iron-ajax#1.4.4" "PolymerElements/iron-ajax#^1.4.4" "0vs4dqcw5y02kj11ivzs901s5nwn97fk01xz2jmpy2fgh6l9q5yr")
12 (fetchbower "iron-autogrow-textarea" "PolymerElements/iron-autogrow-textarea#1.0.15" "PolymerElements/iron-autogrow-textarea#^1.0.13" "1jw40ki5w21il0i9pwjywk4y6mk9lrj8fm57vfg9nlpbiqm2vswb")
13 (fetchbower "iron-a11y-keys" "PolymerElements/iron-a11y-keys#1.0.9" "PolymerElements/iron-a11y-keys#^1.0.6" "07c2wm1p9g52qidl67a43yb7pzd88ygycgghlwzjbh2vkwrs40kp")
14 (fetchbower "iron-flex-layout" "PolymerElements/iron-flex-layout#1.3.9" "PolymerElements/iron-flex-layout#^1.0.0" "1r54la4n8n0lq97vdxnlpdrarxsiwp2b3vfvby9il3j4y4s8vi4h")
15 (fetchbower "paper-behaviors" "PolymerElements/paper-behaviors#1.0.13" "PolymerElements/paper-behaviors#^1.0.0" "0yljykkdg9p67dinplmp6hc5ma6sp95ykah8kz6id5z8gjmsd05b")
16 (fetchbower "paper-material" "PolymerElements/paper-material#1.0.7" "PolymerElements/paper-material#^1.0.0" "1q9r3i5f61y6hmd18h3fcmn7y29yznraz83f9256z8cc0vglfjdb")
17 (fetchbower "paper-styles" "PolymerElements/paper-styles#1.3.1" "PolymerElements/paper-styles#^1.0.0" "11fcxp9kx6sqp2yq0883psn8xyw5d3i753mimqbx8aqa5abvrk4q")
18 (fetchbower "neon-animation" "PolymerElements/neon-animation#1.2.5" "PolymerElements/neon-animation#^1.0.0" "144sq9ijw1nnp2jagpa1ammrc018kp1y6nlmgq1v1iishv4ylsl5")
19 (fetchbower "iron-a11y-announcer" "PolymerElements/iron-a11y-announcer#1.0.6" "PolymerElements/iron-a11y-announcer#^1.0.0" "1az02v91s17v9bir868pifv0s2lwxchm0i4l20176f98366813zk")
20 (fetchbower "iron-overlay-behavior" "PolymerElements/iron-overlay-behavior#1.10.4" "PolymerElements/iron-overlay-behavior#^1.0.9" "0px6s756cgqzxzq53fgk1297j07gyfykqkhdzmj9fwyyrwiv1g8z")
21 (fetchbower "iron-fit-behavior" "PolymerElements/iron-fit-behavior#1.2.7" "PolymerElements/iron-fit-behavior#^1.1.0" "0b864x9cdxadvzkdcn1d3yvi32kqccfv8j467337rgcq193l60jb")
22 (fetchbower "iron-checked-element-behavior" "PolymerElements/iron-checked-element-behavior#1.0.6" "PolymerElements/iron-checked-element-behavior#^1.0.0" "165nh5vkdsr4d5vkq4sj1sz0igfy6vgx844ys164mqg8gkjncvxm")
23 (fetchbower "promise-polyfill" "polymerlabs/promise-polyfill#1.0.1" "polymerlabs/promise-polyfill#^1.0.0" "0warxr9fk2d3cvgiq81djxwiky73gxxr5s3xa97d3c83q1lidlzy")
24 (fetchbower "iron-behaviors" "PolymerElements/iron-behaviors#1.0.18" "PolymerElements/iron-behaviors#^1.0.0" "1icx212kh1cfdvk3v7pdqic9c48pdhnknq8ajx0dlps1l5sm69xh")
25 (fetchbower "iron-validatable-behavior" "PolymerElements/iron-validatable-behavior#1.1.2" "PolymerElements/iron-validatable-behavior#^1.0.0" "1gjjn08y5s43p7aizif24i2yvkd1sasy77dix62irkwzig3favqr")
26 (fetchbower "iron-form-element-behavior" "PolymerElements/iron-form-element-behavior#1.0.7" "PolymerElements/iron-form-element-behavior#^1.0.0" "02qbxqsqxjzy086cqbv6pgibmi0888q757p95ig6x3nc62xk81an")
27 (fetchbower "iron-a11y-keys-behavior" "PolymerElements/iron-a11y-keys-behavior#1.1.9" "PolymerElements/iron-a11y-keys-behavior#^1.0.0" "0dy1ca1nb9v9y968q998vgs147fkmn4irnnrdfl40ln1bln45qx9")
28 (fetchbower "paper-ripple" "PolymerElements/paper-ripple#1.0.10" "PolymerElements/paper-ripple#^1.0.0" "0d5gjf7cw7hk520h6xnav1xrpd948qc8mzvqgqycqkad4j4vdck7")
29 (fetchbower "font-roboto" "PolymerElements/font-roboto#1.1.0" "PolymerElements/font-roboto#^1.0.1" "0z4msvaa5pnr84j2r957g313fmdbdbrknhdw1axy5g48845yv04s")
30 (fetchbower "iron-meta" "PolymerElements/iron-meta#1.1.3" "PolymerElements/iron-meta#^1.0.0" "13lsj648ibkyw3lha6g6r7afmk4yxvgdi63bkpy54wx63gfx7xir")
31 (fetchbower "iron-resizable-behavior" "PolymerElements/iron-resizable-behavior#1.0.6" "PolymerElements/iron-resizable-behavior#^1.0.0" "1r8qk670nigqpw50x1m5yvbx7p9sahiwlf0f9z71v508d63vrbi1")
32 (fetchbower "iron-selector" "PolymerElements/iron-selector#1.5.3" "PolymerElements/iron-selector#^1.0.0" "1362pq6vy113h4y6hn31hhp52hh8g269s5aj7vsq266v7y59igf6")
33 (fetchbower "web-animations-js" "web-animations/web-animations-js#2.3.1" "web-animations/web-animations-js#^2.2.0" "16haz886711qrcf9h9wrjwf5hrz2c69l4jxlq0iyzar823c51qkq")
33 34 ]; }
@@ -1,15 +1,17 b''
1 # This file has been generated by node2nix 1.0.0. Do not edit!
1 # This file has been generated by node2nix 1.5.3. Do not edit!
2 2
3 3 {pkgs ? import <nixpkgs> {
4 4 inherit system;
5 }, system ? builtins.currentSystem}:
5 }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-6_x"}:
6 6
7 7 let
8 8 nodeEnv = import ./node-env.nix {
9 inherit (pkgs) stdenv python utillinux runCommand writeTextFile nodejs;
9 inherit (pkgs) stdenv python2 utillinux runCommand writeTextFile;
10 inherit nodejs;
11 libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null;
10 12 };
11 13 in
12 14 import ./node-packages.nix {
13 15 inherit (pkgs) fetchurl fetchgit;
14 16 inherit nodeEnv;
15 17 } No newline at end of file
@@ -1,292 +1,503 b''
1 1 # This file originates from node2nix
2 2
3 {stdenv, python, nodejs, utillinux, runCommand, writeTextFile}:
3 {stdenv, nodejs, python2, utillinux, libtool, runCommand, writeTextFile}:
4 4
5 5 let
6 python = if nodejs ? python then nodejs.python else python2;
7
6 8 # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise
7 9 tarWrapper = runCommand "tarWrapper" {} ''
8 10 mkdir -p $out/bin
9
11
10 12 cat > $out/bin/tar <<EOF
11 13 #! ${stdenv.shell} -e
12 14 $(type -p tar) "\$@" --warning=no-unknown-keyword
13 15 EOF
14
16
15 17 chmod +x $out/bin/tar
16 18 '';
17
19
18 20 # Function that generates a TGZ file from a NPM project
19 21 buildNodeSourceDist =
20 22 { name, version, src, ... }:
21
23
22 24 stdenv.mkDerivation {
23 25 name = "node-tarball-${name}-${version}";
24 26 inherit src;
25 27 buildInputs = [ nodejs ];
26 28 buildPhase = ''
27 29 export HOME=$TMPDIR
28 30 tgzFile=$(npm pack)
29 31 '';
30 32 installPhase = ''
31 33 mkdir -p $out/tarballs
32 34 mv $tgzFile $out/tarballs
33 35 mkdir -p $out/nix-support
34 36 echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products
35 37 '';
36 38 };
37 39
38 40 includeDependencies = {dependencies}:
39 41 stdenv.lib.optionalString (dependencies != [])
40 42 (stdenv.lib.concatMapStrings (dependency:
41 43 ''
42 44 # Bundle the dependencies of the package
43 45 mkdir -p node_modules
44 46 cd node_modules
45
47
46 48 # Only include dependencies if they don't exist. They may also be bundled in the package.
47 49 if [ ! -e "${dependency.name}" ]
48 50 then
49 51 ${composePackage dependency}
50 52 fi
51
53
52 54 cd ..
53 55 ''
54 56 ) dependencies);
55 57
56 58 # Recursively composes the dependencies of a package
57 59 composePackage = { name, packageName, src, dependencies ? [], ... }@args:
58 let
59 fixImpureDependencies = writeTextFile {
60 name = "fixDependencies.js";
61 text = ''
62 var fs = require('fs');
63 var url = require('url');
64
65 /*
66 * Replaces an impure version specification by *
67 */
68 function replaceImpureVersionSpec(versionSpec) {
69 var parsedUrl = url.parse(versionSpec);
70
71 if(versionSpec == "latest" || versionSpec == "unstable" ||
72 versionSpec.substr(0, 2) == ".." || dependency.substr(0, 2) == "./" || dependency.substr(0, 2) == "~/" || dependency.substr(0, 1) == '/')
73 return '*';
74 else if(parsedUrl.protocol == "git:" || parsedUrl.protocol == "git+ssh:" || parsedUrl.protocol == "git+http:" || parsedUrl.protocol == "git+https:" ||
75 parsedUrl.protocol == "http:" || parsedUrl.protocol == "https:")
76 return '*';
77 else
78 return versionSpec;
79 }
80
81 var packageObj = JSON.parse(fs.readFileSync('./package.json'));
82
83 /* Replace dependencies */
84 if(packageObj.dependencies !== undefined) {
85 for(var dependency in packageObj.dependencies) {
86 var versionSpec = packageObj.dependencies[dependency];
87 packageObj.dependencies[dependency] = replaceImpureVersionSpec(versionSpec);
88 }
89 }
90
91 /* Replace development dependencies */
92 if(packageObj.devDependencies !== undefined) {
93 for(var dependency in packageObj.devDependencies) {
94 var versionSpec = packageObj.devDependencies[dependency];
95 packageObj.devDependencies[dependency] = replaceImpureVersionSpec(versionSpec);
96 }
97 }
98
99 /* Replace optional dependencies */
100 if(packageObj.optionalDependencies !== undefined) {
101 for(var dependency in packageObj.optionalDependencies) {
102 var versionSpec = packageObj.optionalDependencies[dependency];
103 packageObj.optionalDependencies[dependency] = replaceImpureVersionSpec(versionSpec);
104 }
105 }
106
107 /* Write the fixed JSON file */
108 fs.writeFileSync("package.json", JSON.stringify(packageObj));
109 '';
110 };
111 in
112 60 ''
113 61 DIR=$(pwd)
114 62 cd $TMPDIR
115
63
116 64 unpackFile ${src}
117
65
118 66 # Make the base dir in which the target dependency resides first
119 67 mkdir -p "$(dirname "$DIR/${packageName}")"
120 68
121 69 if [ -f "${src}" ]
122 70 then
123 71 # Figure out what directory has been unpacked
124 packageDir=$(find . -type d -maxdepth 1 | tail -1)
125
72 packageDir="$(find . -maxdepth 1 -type d | tail -1)"
73
126 74 # Restore write permissions to make building work
75 find "$packageDir" -type d -print0 | xargs -0 chmod u+x
127 76 chmod -R u+w "$packageDir"
128
77
129 78 # Move the extracted tarball into the output folder
130 79 mv "$packageDir" "$DIR/${packageName}"
131 80 elif [ -d "${src}" ]
132 81 then
82 # Get a stripped name (without hash) of the source directory.
83 # On old nixpkgs it's already set internally.
84 if [ -z "$strippedName" ]
85 then
86 strippedName="$(stripHash ${src})"
87 fi
88
133 89 # Restore write permissions to make building work
134 chmod -R u+w $strippedName
135
136 # Move the extracted directory into the output folder
137 mv $strippedName "$DIR/${packageName}"
90 chmod -R u+w "$strippedName"
91
92 # Move the extracted directory into the output folder
93 mv "$strippedName" "$DIR/${packageName}"
138 94 fi
139
95
140 96 # Unset the stripped name to not confuse the next unpack step
141 97 unset strippedName
142
143 # Some version specifiers (latest, unstable, URLs, file paths) force NPM to make remote connections or consult paths outside the Nix store.
144 # The following JavaScript replaces these by * to prevent that
98
99 # Include the dependencies of the package
145 100 cd "$DIR/${packageName}"
146 node ${fixImpureDependencies}
147
148 # Include the dependencies of the package
149 101 ${includeDependencies { inherit dependencies; }}
150 102 cd ..
151 103 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
152 104 '';
153 105
106 pinpointDependencies = {dependencies, production}:
107 let
108 pinpointDependenciesFromPackageJSON = writeTextFile {
109 name = "pinpointDependencies.js";
110 text = ''
111 var fs = require('fs');
112 var path = require('path');
113
114 function resolveDependencyVersion(location, name) {
115 if(location == process.env['NIX_STORE']) {
116 return null;
117 } else {
118 var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json");
119
120 if(fs.existsSync(dependencyPackageJSON)) {
121 var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON));
122
123 if(dependencyPackageObj.name == name) {
124 return dependencyPackageObj.version;
125 }
126 } else {
127 return resolveDependencyVersion(path.resolve(location, ".."), name);
128 }
129 }
130 }
131
132 function replaceDependencies(dependencies) {
133 if(typeof dependencies == "object" && dependencies !== null) {
134 for(var dependency in dependencies) {
135 var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency);
136
137 if(resolvedVersion === null) {
138 process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n");
139 } else {
140 dependencies[dependency] = resolvedVersion;
141 }
142 }
143 }
144 }
145
146 /* Read the package.json configuration */
147 var packageObj = JSON.parse(fs.readFileSync('./package.json'));
148
149 /* Pinpoint all dependencies */
150 replaceDependencies(packageObj.dependencies);
151 if(process.argv[2] == "development") {
152 replaceDependencies(packageObj.devDependencies);
153 }
154 replaceDependencies(packageObj.optionalDependencies);
155
156 /* Write the fixed package.json file */
157 fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2));
158 '';
159 };
160 in
161 ''
162 node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
163
164 ${stdenv.lib.optionalString (dependencies != [])
165 ''
166 if [ -d node_modules ]
167 then
168 cd node_modules
169 ${stdenv.lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
170 cd ..
171 fi
172 ''}
173 '';
174
175 # Recursively traverses all dependencies of a package and pinpoints all
176 # dependencies in the package.json file to the versions that are actually
177 # being used.
178
179 pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args:
180 ''
181 if [ -d "${packageName}" ]
182 then
183 cd "${packageName}"
184 ${pinpointDependencies { inherit dependencies production; }}
185 cd ..
186 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
187 fi
188 '';
189
154 190 # Extract the Node.js source code which is used to compile packages with
155 191 # native bindings
156 192 nodeSources = runCommand "node-sources" {} ''
157 193 tar --no-same-owner --no-same-permissions -xf ${nodejs.src}
158 194 mv node-* $out
159 195 '';
160
196
197 # Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty)
198 addIntegrityFieldsScript = writeTextFile {
199 name = "addintegrityfields.js";
200 text = ''
201 var fs = require('fs');
202 var path = require('path');
203
204 function augmentDependencies(baseDir, dependencies) {
205 for(var dependencyName in dependencies) {
206 var dependency = dependencies[dependencyName];
207
208 // Open package.json and augment metadata fields
209 var packageJSONDir = path.join(baseDir, "node_modules", dependencyName);
210 var packageJSONPath = path.join(packageJSONDir, "package.json");
211
212 if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored
213 console.log("Adding metadata fields to: "+packageJSONPath);
214 var packageObj = JSON.parse(fs.readFileSync(packageJSONPath));
215
216 if(dependency.integrity) {
217 packageObj["_integrity"] = dependency.integrity;
218 } else {
219 packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads.
220 }
221
222 packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories.
223 fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2));
224 }
225
226 // Augment transitive dependencies
227 if(dependency.dependencies !== undefined) {
228 augmentDependencies(packageJSONDir, dependency.dependencies);
229 }
230 }
231 }
232
233 if(fs.existsSync("./package-lock.json")) {
234 var packageLock = JSON.parse(fs.readFileSync("./package-lock.json"));
235
236 if(packageLock.lockfileVersion !== 1) {
237 process.stderr.write("Sorry, I only understand lock file version 1!\n");
238 process.exit(1);
239 }
240
241 if(packageLock.dependencies !== undefined) {
242 augmentDependencies(".", packageLock.dependencies);
243 }
244 }
245 '';
246 };
247
248 # Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes
249 reconstructPackageLock = writeTextFile {
250 name = "addintegrityfields.js";
251 text = ''
252 var fs = require('fs');
253 var path = require('path');
254
255 var packageObj = JSON.parse(fs.readFileSync("package.json"));
256
257 var lockObj = {
258 name: packageObj.name,
259 version: packageObj.version,
260 lockfileVersion: 1,
261 requires: true,
262 dependencies: {}
263 };
264
265 function augmentPackageJSON(filePath, dependencies) {
266 var packageJSON = path.join(filePath, "package.json");
267 if(fs.existsSync(packageJSON)) {
268 var packageObj = JSON.parse(fs.readFileSync(packageJSON));
269 dependencies[packageObj.name] = {
270 version: packageObj.version,
271 integrity: "sha1-000000000000000000000000000=",
272 dependencies: {}
273 };
274 processDependencies(path.join(filePath, "node_modules"), dependencies[packageObj.name].dependencies);
275 }
276 }
277
278 function processDependencies(dir, dependencies) {
279 if(fs.existsSync(dir)) {
280 var files = fs.readdirSync(dir);
281
282 files.forEach(function(entry) {
283 var filePath = path.join(dir, entry);
284 var stats = fs.statSync(filePath);
285
286 if(stats.isDirectory()) {
287 if(entry.substr(0, 1) == "@") {
288 // When we encounter a namespace folder, augment all packages belonging to the scope
289 var pkgFiles = fs.readdirSync(filePath);
290
291 pkgFiles.forEach(function(entry) {
292 if(stats.isDirectory()) {
293 var pkgFilePath = path.join(filePath, entry);
294 augmentPackageJSON(pkgFilePath, dependencies);
295 }
296 });
297 } else {
298 augmentPackageJSON(filePath, dependencies);
299 }
300 }
301 });
302 }
303 }
304
305 processDependencies("node_modules", lockObj.dependencies);
306
307 fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2));
308 '';
309 };
310
161 311 # Builds and composes an NPM package including all its dependencies
162 buildNodePackage = { name, packageName, version, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, preRebuild ? "", ... }@args:
163
312 buildNodePackage = { name, packageName, version, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, bypassCache ? false, preRebuild ? "", ... }@args:
313
314 let
315 forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
316 in
164 317 stdenv.lib.makeOverridable stdenv.mkDerivation (builtins.removeAttrs args [ "dependencies" ] // {
165 318 name = "node-${name}-${version}";
166 buildInputs = [ tarWrapper python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or [];
319 buildInputs = [ tarWrapper python nodejs ]
320 ++ stdenv.lib.optional (stdenv.isLinux) utillinux
321 ++ stdenv.lib.optional (stdenv.isDarwin) libtool
322 ++ args.buildInputs or [];
167 323 dontStrip = args.dontStrip or true; # Striping may fail a build for some package deployments
168
324
169 325 inherit dontNpmInstall preRebuild;
170
326
171 327 unpackPhase = args.unpackPhase or "true";
172
328
173 329 buildPhase = args.buildPhase or "true";
174
330
175 331 compositionScript = composePackage args;
176 passAsFile = [ "compositionScript" ];
177
332 pinpointDependenciesScript = pinpointDependenciesOfPackage args;
333
334 passAsFile = [ "compositionScript" "pinpointDependenciesScript" ];
335
178 336 installPhase = args.installPhase or ''
179 337 # Create and enter a root node_modules/ folder
180 338 mkdir -p $out/lib/node_modules
181 339 cd $out/lib/node_modules
182
340
183 341 # Compose the package and all its dependencies
184 342 source $compositionScriptPath
185
343
344 # Pinpoint the versions of all dependencies to the ones that are actually being used
345 echo "pinpointing versions of dependencies..."
346 source $pinpointDependenciesScriptPath
347
186 348 # Patch the shebangs of the bundled modules to prevent them from
187 349 # calling executables outside the Nix store as much as possible
188 350 patchShebangs .
189
351
190 352 # Deploy the Node.js package by running npm install. Since the
191 353 # dependencies have been provided already by ourselves, it should not
192 354 # attempt to install them again, which is good, because we want to make
193 355 # it Nix's responsibility. If it needs to install any dependencies
194 356 # anyway (e.g. because the dependency parameters are
195 357 # incomplete/incorrect), it fails.
196 358 #
197 359 # The other responsibilities of NPM are kept -- version checks, build
198 360 # steps, postprocessing etc.
199
361
200 362 export HOME=$TMPDIR
201 363 cd "${packageName}"
202 364 runHook preRebuild
203 npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
204
365
366 ${stdenv.lib.optionalString bypassCache ''
367 if [ ! -f package-lock.json ]
368 then
369 echo "No package-lock.json file found, reconstructing..."
370 node ${reconstructPackageLock}
371 fi
372
373 node ${addIntegrityFieldsScript}
374 ''}
375
376 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
377
205 378 if [ "$dontNpmInstall" != "1" ]
206 379 then
207 npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
380 # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
381 rm -f npm-shrinkwrap.json
382
383 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
208 384 fi
209
385
210 386 # Create symlink to the deployed executable folder, if applicable
211 387 if [ -d "$out/lib/node_modules/.bin" ]
212 388 then
213 389 ln -s $out/lib/node_modules/.bin $out/bin
214 390 fi
215
391
216 392 # Create symlinks to the deployed manual page folders, if applicable
217 393 if [ -d "$out/lib/node_modules/${packageName}/man" ]
218 394 then
219 395 mkdir -p $out/share
220 396 for dir in "$out/lib/node_modules/${packageName}/man/"*
221 397 do
222 398 mkdir -p $out/share/man/$(basename "$dir")
223 399 for page in "$dir"/*
224 400 do
225 401 ln -s $page $out/share/man/$(basename "$dir")
226 402 done
227 403 done
228 404 fi
405
406 # Run post install hook, if provided
407 runHook postInstall
229 408 '';
230 409 });
231 410
232 411 # Builds a development shell
233 buildNodeShell = { name, packageName, version, src, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, ... }@args:
412 buildNodeShell = { name, packageName, version, src, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, bypassCache ? false, ... }@args:
234 413 let
414 forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
415
235 416 nodeDependencies = stdenv.mkDerivation {
236 417 name = "node-dependencies-${name}-${version}";
237
238 buildInputs = [ tarWrapper python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or [];
239
418
419 buildInputs = [ tarWrapper python nodejs ]
420 ++ stdenv.lib.optional (stdenv.isLinux) utillinux
421 ++ stdenv.lib.optional (stdenv.isDarwin) libtool
422 ++ args.buildInputs or [];
423
240 424 includeScript = includeDependencies { inherit dependencies; };
241 passAsFile = [ "includeScript" ];
242
425 pinpointDependenciesScript = pinpointDependenciesOfPackage args;
426
427 passAsFile = [ "includeScript" "pinpointDependenciesScript" ];
428
243 429 buildCommand = ''
244 mkdir -p $out/lib
245 cd $out/lib
430 mkdir -p $out/${packageName}
431 cd $out/${packageName}
432
246 433 source $includeScriptPath
247
434
248 435 # Create fake package.json to make the npm commands work properly
249 cat > package.json <<EOF
250 {
251 "name": "${packageName}",
252 "version": "${version}"
253 }
254 EOF
255
436 cp ${src}/package.json .
437 chmod 644 package.json
438 ${stdenv.lib.optionalString bypassCache ''
439 if [ -f ${src}/package-lock.json ]
440 then
441 cp ${src}/package-lock.json .
442 fi
443 ''}
444
445 # Pinpoint the versions of all dependencies to the ones that are actually being used
446 echo "pinpointing versions of dependencies..."
447 cd ..
448 source $pinpointDependenciesScriptPath
449 cd ${packageName}
450
256 451 # Patch the shebangs of the bundled modules to prevent them from
257 452 # calling executables outside the Nix store as much as possible
258 453 patchShebangs .
259
260 export HOME=$TMPDIR
261 npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
262
263 ${stdenv.lib.optionalString (!dontNpmInstall) ''
264 npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
454
455 export HOME=$PWD
456
457 ${stdenv.lib.optionalString bypassCache ''
458 if [ ! -f package-lock.json ]
459 then
460 echo "No package-lock.json file found, reconstructing..."
461 node ${reconstructPackageLock}
462 fi
463
464 node ${addIntegrityFieldsScript}
265 465 ''}
266 466
467 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
468
469 ${stdenv.lib.optionalString (!dontNpmInstall) ''
470 # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
471 rm -f npm-shrinkwrap.json
472
473 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
474 ''}
475
476 cd ..
477 mv ${packageName} lib
267 478 ln -s $out/lib/node_modules/.bin $out/bin
268 479 '';
269 480 };
270 481 in
271 482 stdenv.lib.makeOverridable stdenv.mkDerivation {
272 483 name = "node-shell-${name}-${version}";
273
484
274 485 buildInputs = [ python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or [];
275 486 buildCommand = ''
276 487 mkdir -p $out/bin
277 488 cat > $out/bin/shell <<EOF
278 489 #! ${stdenv.shell} -e
279 490 $shellHook
280 491 exec ${stdenv.shell}
281 492 EOF
282 493 chmod +x $out/bin/shell
283 494 '';
284
495
285 496 # Provide the dependencies in a development shell through the NODE_PATH environment variable
286 497 inherit nodeDependencies;
287 498 shellHook = stdenv.lib.optionalString (dependencies != []) ''
288 499 export NODE_PATH=$nodeDependencies/lib/node_modules
289 500 '';
290 501 };
291 502 in
292 503 { inherit buildNodeSourceDist buildNodePackage buildNodeShell; }
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from pkgs/patch-beaker-lock-func-debug.diff to pkgs/patch_beaker/patch-beaker-lock-func-debug.diff
1 NO CONTENT: file renamed from pkgs/patch-beaker-metadata-reuse.diff to pkgs/patch_beaker/patch-beaker-metadata-reuse.diff
@@ -1,251 +1,239 b''
1 1 # Overrides for the generated python-packages.nix
2 2 #
3 3 # This function is intended to be used as an extension to the generated file
4 4 # python-packages.nix. The main objective is to add needed dependencies of C
5 5 # libraries and tweak the build instructions where needed.
6 6
7 { pkgs, basePythonPackages }:
7 { pkgs
8 , basePythonPackages
9 }:
8 10
9 11 let
10 12 sed = "sed -i";
13
11 14 localLicenses = {
12 15 repoze = {
13 16 fullName = "Repoze License";
14 17 url = http://www.repoze.org/LICENSE.txt;
15 18 };
16 19 };
17 20
18 21 in
19 22
20 23 self: super: {
21 24
22 appenlight-client = super.appenlight-client.override (attrs: {
25 "appenlight-client" = super."appenlight-client".override (attrs: {
23 26 meta = {
24 27 license = [ pkgs.lib.licenses.bsdOriginal ];
25 28 };
26 29 });
27 30
28 beaker = super.beaker.override (attrs: {
31 "beaker" = super."beaker".override (attrs: {
29 32 patches = [
30 ./patch-beaker-lock-func-debug.diff
31 ./patch-beaker-metadata-reuse.diff
33 ./patch_beaker/patch-beaker-lock-func-debug.diff
34 ./patch_beaker/patch-beaker-metadata-reuse.diff
32 35 ];
33 36 });
34 37
35 future = super.future.override (attrs: {
38 "future" = super."future".override (attrs: {
36 39 meta = {
37 40 license = [ pkgs.lib.licenses.mit ];
38 41 };
39 42 });
40 43
41 testpath = super.testpath.override (attrs: {
44 "testpath" = super."testpath".override (attrs: {
42 45 meta = {
43 46 license = [ pkgs.lib.licenses.mit ];
44 47 };
45 48 });
46 49
47 gnureadline = super.gnureadline.override (attrs: {
48 buildInputs = attrs.buildInputs ++ [
50 "gnureadline" = super."gnureadline".override (attrs: {
51 buildInputs = [
49 52 pkgs.ncurses
50 53 ];
51 54 patchPhase = ''
52 55 substituteInPlace setup.py --replace "/bin/bash" "${pkgs.bash}/bin/bash"
53 56 '';
54 57 });
55 58
56 gunicorn = super.gunicorn.override (attrs: {
57 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
59 "gunicorn" = super."gunicorn".override (attrs: {
60 propagatedBuildInputs = [
58 61 # johbo: futures is needed as long as we are on Python 2, otherwise
59 62 # gunicorn explodes if used with multiple threads per worker.
60 self.futures
63 self."futures"
61 64 ];
62 65 });
63 66
64 nbconvert = super.nbconvert.override (attrs: {
67 "nbconvert" = super."nbconvert".override (attrs: {
65 68 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
66 69 # marcink: plug in jupyter-client for notebook rendering
67 self.jupyter-client
70 self."jupyter-client"
68 71 ];
69 72 });
70 73
71 ipython = super.ipython.override (attrs: {
74 "ipython" = super."ipython".override (attrs: {
72 75 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
73 self.gnureadline
76 self."gnureadline"
74 77 ];
75 78 });
76 79
77 lxml = super.lxml.override (attrs: {
78 # johbo: On 16.09 we need this to compile on darwin, otherwise compilation
79 # fails on Darwin.
80 hardeningDisable = if pkgs.stdenv.isDarwin then [ "format" ] else null;
81 buildInputs = with self; [
80 "lxml" = super."lxml".override (attrs: {
81 buildInputs = [
82 82 pkgs.libxml2
83 83 pkgs.libxslt
84 84 ];
85 propagatedBuildInputs = [
86 # Needed, so that "setup.py bdist_wheel" does work
87 self."wheel"
88 ];
85 89 });
86 90
87 mysql-python = super.mysql-python.override (attrs: {
88 buildInputs = attrs.buildInputs ++ [
91 "mysql-python" = super."mysql-python".override (attrs: {
92 buildInputs = [
89 93 pkgs.openssl
90 94 ];
91 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
95 propagatedBuildInputs = [
92 96 pkgs.libmysql
93 97 pkgs.zlib
94 98 ];
95 99 });
96 100
97 psutil = super.psutil.override (attrs: {
98 buildInputs = attrs.buildInputs ++
99 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.IOKit;
100 });
101
102 psycopg2 = super.psycopg2.override (attrs: {
103 buildInputs = attrs.buildInputs ++
104 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.openssl;
105 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
101 "psycopg2" = super."psycopg2".override (attrs: {
102 propagatedBuildInputs = [
106 103 pkgs.postgresql
107 104 ];
108 105 meta = {
109 106 license = pkgs.lib.licenses.lgpl3Plus;
110 107 };
111 108 });
112 109
113 pycurl = super.pycurl.override (attrs: {
114 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
110 "pycurl" = super."pycurl".override (attrs: {
111 propagatedBuildInputs = [
115 112 pkgs.curl
116 113 pkgs.openssl
117 114 ];
118 115 preConfigure = ''
119 116 substituteInPlace setup.py --replace '--static-libs' '--libs'
120 117 export PYCURL_SSL_LIBRARY=openssl
121 118 '';
122 119 meta = {
123 # TODO: It is LGPL and MIT
124 120 license = pkgs.lib.licenses.mit;
125 121 };
126 122 });
127 123
128 pyramid = super.pyramid.override (attrs: {
129 postFixup = ''
130 wrapPythonPrograms
131 # TODO: johbo: "wrapPython" adds this magic line which
132 # confuses pserve.
133 ${sed} '/import sys; sys.argv/d' $out/bin/.pserve-wrapped
134 '';
124 "pyramid" = super."pyramid".override (attrs: {
135 125 meta = {
136 126 license = localLicenses.repoze;
137 127 };
138 128 });
139 129
140 pyramid-debugtoolbar = super.pyramid-debugtoolbar.override (attrs: {
130 "pyramid-debugtoolbar" = super."pyramid-debugtoolbar".override (attrs: {
141 131 meta = {
142 132 license = [ pkgs.lib.licenses.bsdOriginal localLicenses.repoze ];
143 133 };
144 134 });
145 135
146 pysqlite = super.pysqlite.override (attrs: {
136 "pysqlite" = super."pysqlite".override (attrs: {
147 137 propagatedBuildInputs = [
148 138 pkgs.sqlite
149 139 ];
150 140 meta = {
151 141 license = [ pkgs.lib.licenses.zlib pkgs.lib.licenses.libpng ];
152 142 };
153 143 });
154 144
155 pytest-runner = super.pytest-runner.override (attrs: {
145 "pytest-runner" = super."pytest-runner".override (attrs: {
156 146 propagatedBuildInputs = [
157 self.setuptools-scm
147 self."setuptools-scm"
148 ];
149 });
150
151 "python-ldap" = super."python-ldap".override (attrs: {
152 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
153 pkgs.openldap
154 pkgs.cyrus_sasl
155 pkgs.openssl
158 156 ];
159 157 });
160 158
161 python-ldap = super.python-ldap.override (attrs: {
162 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
163 pkgs.cyrus_sasl
164 pkgs.openldap
165 pkgs.openssl
159 "python-pam" = super."python-pam".override (attrs: {
160 propagatedBuildInputs = [
161 pkgs.pam
166 162 ];
167 # TODO: johbo: Remove the "or" once we drop 16.03 support.
168 NIX_CFLAGS_COMPILE = "-I${pkgs.cyrus_sasl.dev or pkgs.cyrus_sasl}/include/sasl";
163 # TODO: johbo: Check if this can be avoided, or transform into
164 # a real patch
165 patchPhase = ''
166 substituteInPlace pam.py \
167 --replace 'find_library("pam")' '"${pkgs.pam}/lib/libpam.so.0"'
168 '';
169 });
170
171 "pyzmq" = super."pyzmq".override (attrs: {
172 buildInputs = [
173 pkgs.czmq
174 ];
169 175 });
170 176
171 python-pam = super.python-pam.override (attrs:
172 let
173 includeLibPam = pkgs.stdenv.isLinux;
174 in {
175 # TODO: johbo: Move the option up into the default.nix, we should
176 # include python-pam only on supported platforms.
177 propagatedBuildInputs = attrs.propagatedBuildInputs ++
178 pkgs.lib.optional includeLibPam [
179 pkgs.pam
180 ];
181 # TODO: johbo: Check if this can be avoided, or transform into
182 # a real patch
183 patchPhase = pkgs.lib.optionals includeLibPam ''
184 substituteInPlace pam.py \
185 --replace 'find_library("pam")' '"${pkgs.pam}/lib/libpam.so.0"'
186 '';
187 });
188
189 urlobject = super.urlobject.override (attrs: {
177 "urlobject" = super."urlobject".override (attrs: {
190 178 meta = {
191 179 license = {
192 180 spdxId = "Unlicense";
193 181 fullName = "The Unlicense";
194 182 url = http://unlicense.org/;
195 183 };
196 184 };
197 185 });
198 186
199 docutils = super.docutils.override (attrs: {
187 "docutils" = super."docutils".override (attrs: {
200 188 meta = {
201 189 license = pkgs.lib.licenses.bsd2;
202 190 };
203 191 });
204 192
205 colander = super.colander.override (attrs: {
193 "colander" = super."colander".override (attrs: {
206 194 meta = {
207 195 license = localLicenses.repoze;
208 196 };
209 197 });
210 198
211 pyramid-beaker = super.pyramid-beaker.override (attrs: {
199 "pyramid-beaker" = super."pyramid-beaker".override (attrs: {
212 200 meta = {
213 201 license = localLicenses.repoze;
214 202 };
215 203 });
216 204
217 pyramid-mako = super.pyramid-mako.override (attrs: {
205 "pyramid-mako" = super."pyramid-mako".override (attrs: {
218 206 meta = {
219 207 license = localLicenses.repoze;
220 208 };
221 209 });
222 210
223 repoze.lru = super.repoze.lru.override (attrs: {
211 "repoze.lru" = super."repoze.lru".override (attrs: {
224 212 meta = {
225 213 license = localLicenses.repoze;
226 214 };
227 215 });
228 216
229 python-editor = super.python-editor.override (attrs: {
217 "python-editor" = super."python-editor".override (attrs: {
230 218 meta = {
231 219 license = pkgs.lib.licenses.asl20;
232 220 };
233 221 });
234 222
235 translationstring = super.translationstring.override (attrs: {
223 "translationstring" = super."translationstring".override (attrs: {
236 224 meta = {
237 225 license = localLicenses.repoze;
238 226 };
239 227 });
240 228
241 venusian = super.venusian.override (attrs: {
229 "venusian" = super."venusian".override (attrs: {
242 230 meta = {
243 231 license = localLicenses.repoze;
244 232 };
245 233 });
246 234
247 # Avoid that setuptools is replaced, this leads to trouble
248 # with buildPythonPackage.
249 setuptools = basePythonPackages.setuptools;
235 # Avoid that base packages screw up the build process
236 inherit (basePythonPackages)
237 setuptools;
250 238
251 239 }
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,232 +1,16 b''
1 #
2 # About
3 # =====
4 #
5 # This file defines jobs for our CI system and the attribute "build" is used
6 # as the input for packaging.
7 #
8 #
9 # CI details
10 # ==========
11 #
12 # This file defines an attribute set of derivations. Each of these attributes is
13 # then used in our CI system as one job to run. This way we keep the
14 # configuration for the CI jobs as well under version control.
15 #
16 # Run CI jobs locally
17 # -------------------
18 #
19 # Since it is all based on normal Nix derivations, the jobs can be tested
20 # locally with a run of "nix-build" like the following example:
21 #
22 # nix-build release.nix -A test-api -I vcsserver=~/rhodecode-vcsserver
23 #
24 # Note: Replace "~/rhodecode-vcsserver" with a path where a clone of the
25 # vcsserver resides.
1 # This file defines how to "build" for packaging.
26 2
27 3 { pkgs ? import <nixpkgs> {}
28 4 , doCheck ? true
29 5 }:
30 6
31 7 let
32
33 inherit (pkgs)
34 stdenv
35 system;
36
37 testing = import <nixpkgs/nixos/lib/testing.nix> {
38 inherit system;
39 };
40
41 runInMachine = testing.runInMachine;
42
43 sphinx = import ./docs/default.nix {};
44
45 mkDocs = kind: stdenv.mkDerivation {
46 name = kind;
47 srcs = [
48 (./. + (builtins.toPath "/${kind}"))
49 (builtins.filterSource
50 (path: type: baseNameOf path == "VERSION")
51 ./rhodecode)
52 ];
53 sourceRoot = kind;
54 buildInputs = [ sphinx ];
55 configurePhase = null;
56 buildPhase = ''
57 make SPHINXBUILD=sphinx-build html
58 '';
59 installPhase = ''
60 mkdir -p $out
61 mv _build/html $out/
62
63 mkdir -p $out/nix-support
64 echo "doc manual $out/html index.html" >> \
65 "$out/nix-support/hydra-build-products"
66 '';
67 };
68
69 enterprise = import ./default.nix {
8 enterprise_ce = import ./default.nix {
70 9 inherit
10 doCheck
71 11 pkgs;
72
73 # TODO: for quick local testing
74 doCheck = false;
75 };
76
77 test-cfg = stdenv.mkDerivation {
78 name = "test-cfg";
79 unpackPhase = "true";
80 buildInputs = [
81 enterprise.src
82 ];
83 installPhase = ''
84 mkdir -p $out/etc
85 cp ${enterprise.src}/test.ini $out/etc/enterprise.ini
86 # TODO: johbo: Needed, so that the login works, this causes
87 # probably some side effects
88 substituteInPlace $out/etc/enterprise.ini --replace "is_test = True" ""
89
90 # Gevent configuration
91 cp $out/etc/enterprise.ini $out/etc/enterprise-gevent.ini;
92 cat >> $out/etc/enterprise-gevent.ini <<EOF
93
94 [server:main]
95 use = egg:gunicorn#main
96 worker_class = gevent
97 EOF
98
99 cp ${enterprise.src}/vcsserver/test.ini $out/etc/vcsserver.ini
100 '';
101 };
102
103 ac-test-drv = import ./acceptance_tests {
104 withExternals = false;
105 12 };
106 13
107 # TODO: johbo: Currently abusing buildPythonPackage to make the
108 # needed environment for the ac-test tools.
109 mkAcTests = {
110 # Path to an INI file which will be used to run Enterprise.
111 #
112 # Intended usage is to provide different configuration files to
113 # run the tests against a different configuration.
114 enterpriseCfg ? "${test-cfg}/etc/enterprise.ini"
115
116 # Path to an INI file which will be used to run the VCSServer.
117 , vcsserverCfg ? "${test-cfg}/etc/vcsserver.ini"
118 }: pkgs.pythonPackages.buildPythonPackage {
119 name = "enterprise-ac-tests";
120 src = ./acceptance_tests;
121
122 buildInputs = with pkgs; [
123 curl
124 enterprise
125 ac-test-drv
126 ];
127
128 buildPhase = ''
129 cp ${enterpriseCfg} enterprise.ini
130
131 echo "Creating a fake home directory"
132 mkdir fake-home
133 export HOME=$PWD/fake-home
134
135 echo "Creating a repository directory"
136 mkdir repos
137
138 echo "Preparing the database"
139 rc-setup-app \
140 --user=admin \
141 --email=admin@example.com \
142 --password=secret \
143 --api-key=9999999999999999999999999999999999999999 \
144 --force-yes \
145 --repos=$PWD/repos \
146 enterprise.ini > /dev/null
147
148 echo "Starting rc-server"
149 vcsserver --config ${vcsserverCfg} >vcsserver.log 2>&1 &
150 rc-server enterprise.ini >rc-server.log 2>&1 &
151
152 while ! curl -f -s http://localhost:5000 > /dev/null
153 do
154 echo "Waiting for server to be ready..."
155 sleep 3
156 done
157 echo "Webserver is ready."
158
159 echo "Starting the test run"
160 py.test -c example.ini -vs --maxfail=5 tests
161
162 echo "Kill rc-server"
163 kill %2
164 kill %1
165 '';
166
167 # TODO: johbo: Use the install phase again once the normal mkDerivation
168 # can be used again.
169 postInstall = ''
170 mkdir -p $out
171 cp enterprise.ini $out
172 cp ${vcsserverCfg} $out/vcsserver.ini
173 cp rc-server.log $out
174 cp vcsserver.log $out
175
176 mkdir -p $out/nix-support
177 echo "report config $out enterprise.ini" >> $out/nix-support/hydra-build-products
178 echo "report config $out vcsserver.ini" >> $out/nix-support/hydra-build-products
179 echo "report rc-server $out rc-server.log" >> $out/nix-support/hydra-build-products
180 echo "report vcsserver $out vcsserver.log" >> $out/nix-support/hydra-build-products
181 '';
182 };
183
184 vcsserver = import <vcsserver> {
185 inherit pkgs;
186
187 # TODO: johbo: Think of a more elegant solution to this problem
188 pythonExternalOverrides = self: super: (enterprise.myPythonPackagesUnfix self);
189 };
190
191 runTests = optionString: (enterprise.override (attrs: {
192 doCheck = true;
193 name = "test-run";
194 buildInputs = attrs.buildInputs ++ [
195 vcsserver
196 ];
197 checkPhase = ''
198 py.test ${optionString} -vv -ra
199 '';
200 buildPhase = attrs.shellHook;
201 installPhase = ''
202 echo "Intentionally not installing anything"
203 '';
204 meta.description = "Enterprise test run ${optionString}";
205 }));
206
207 jobs = {
208
209 build = enterprise;
210
211 # johbo: Currently this is simply running the tests against the sources. Nicer
212 # would be to run xdist and against the installed application, so that we also
213 # cover the impact of installing the application.
214 test-api = runTests "rhodecode/api";
215 test-functional = runTests "rhodecode/tests/functional";
216 test-rest = runTests "rhodecode/tests --ignore=rhodecode/tests/functional";
217 test-full = runTests "rhodecode";
218
219 docs = mkDocs "docs";
220
221 aggregate = pkgs.releaseTools.aggregate {
222 name = "aggregated-jobs";
223 constituents = [
224 jobs.build
225 jobs.test-api
226 jobs.test-rest
227 jobs.docs
228 ];
229 };
230 };
231
232 in jobs
14 in {
15 build = enterprise_ce;
16 }
@@ -1,130 +1,129 b''
1 ## core
2 setuptools==39.2.0
3 setuptools-scm==1.15.6
1 ## dependencies
4 2
3 setuptools-scm==2.1.0
5 4 amqp==2.3.1
6 5 authomatic==0.1.0.post1
7 6 babel==1.3
8 7 beaker==1.9.1
9 8 celery==4.1.1
10 9 chameleon==2.24
11 10 channelstream==0.5.2
12 11 click==6.6
13 12 colander==1.4.0
14 13 configobj==5.0.6
15 14 cssselect==1.0.3
16 15 decorator==4.1.2
17 16 deform==2.0.5
18 17 docutils==0.14.0
19 18 dogpile.cache==0.6.5
20 19 dogpile.core==0.4.1
21 20 ecdsa==0.13
22 21 formencode==1.2.4
23 22 future==0.14.3
24 23 futures==3.0.2
25 24 gnureadline==6.3.8
26 25 infrae.cache==1.0.1
27 26 iso8601==0.1.11
28 27 itsdangerous==0.24
29 28 jinja2==2.9.6
30 29 billiard==3.5.0.3
31 30 kombu==4.2.0
32 31 lxml==3.7.3
33 32 mako==1.0.7
34 33 markdown==2.6.11
35 34 markupsafe==1.0.0
36 35 msgpack-python==0.4.8
37 36 mysql-python==1.2.5
38 37 pymysql==0.8.1
39 38 objgraph==3.1.1
40 39 packaging==15.2
41 40 paste==2.0.3
42 41 pastedeploy==1.5.2
43 42 pastescript==2.0.2
44 43 pathlib2==2.3.0
45 44 peppercorn==0.5
46 45 psutil==5.4.5
47 46 psycopg2==2.7.4
48 47 py-bcrypt==0.4
49 48 pycrypto==2.6.1
50 49 pycurl==7.19.5
51 50 pyflakes==0.8.1
52 51 pygments-markdown-lexer==0.1.0.dev39
53 52 pygments==2.2.0
54 53 pyparsing==1.5.7
55 54 pyramid-beaker==0.8
56 55 pyramid-debugtoolbar==4.4.0
57 56 pyramid-jinja2==2.7
58 57 pyramid-mako==1.0.2
59 58 pyramid==1.9.2
60 59 pysqlite==2.8.3
61 60 python-dateutil
62 python-ldap==2.4.45
61 python-ldap==3.1.0
63 62 python-memcached==1.59
64 63 python-pam==1.8.2
65 64 pytz==2018.4
66 65 tzlocal==1.5.1
67 66 pyzmq==14.6.0
68 67 py-gfm==0.1.3
69 68 redis==2.10.6
70 69 repoze.lru==0.7
71 70 requests==2.9.1
72 71 routes==2.4.1
73 72 setproctitle==1.1.10
74 73 simplejson==3.11.1
75 74 six==1.11.0
76 75 sqlalchemy==1.1.18
77 76 sshpubkeys==2.2.0
78 77 subprocess32==3.5.1
79 78 supervisor==3.3.4
80 79 tempita==0.5.2
81 80 translationstring==1.3
82 81 trollius==1.0.4
83 82 urllib3==1.21
84 83 urlobject==2.4.3
85 84 venusian==1.1.0
86 85 weberror==0.10.3
87 86 webhelpers2==2.0
88 87 webhelpers==1.3
89 88 webob==1.7.4
90 89 whoosh==2.7.4
91 90 wsgiref==0.1.2
92 91 zope.cachedescriptors==4.3.1
93 92 zope.deprecation==4.3.0
94 93 zope.event==4.3.0
95 94 zope.interface==4.5.0
96 95
97 96
98 97 # IPYTHON RENDERING
99 98 # entrypoints backport, pypi version doesn't support egg installs
100 99 https://code.rhodecode.com/upstream/entrypoints/archive/96e6d645684e1af3d7df5b5272f3fe85a546b233.tar.gz?md5=7db37771aea9ac9fefe093e5d6987313#egg=entrypoints==0.2.2.rhodecode-upstream1
101 100 nbconvert==5.3.1
102 101 bleach==2.1.3
103 102 nbformat==4.4.0
104 103 jupyter_client==5.0.0
105 104
106 105 ## cli tools
107 106 alembic==0.9.9
108 107 invoke==0.13.0
109 108 bumpversion==0.5.3
110 109
111 110 ## http servers
112 111 gevent==1.2.2
113 112 greenlet==0.4.13
114 113 gunicorn==19.7.1
115 114 waitress==1.1.0
116 115
117 116 ## debug
118 117 ipdb==0.11.0
119 118 ipython==5.1.0
120 119 cprofilev==1.0.7
121 120 bottle==0.12.13
122 121
123 122 ## rhodecode-tools, special case
124 123 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.15.0.tar.gz?md5=1046043b8c8d52480f7bca63185729b5#egg=rhodecode-tools==0.15.0
125 124
126 125 ## appenlight
127 126 appenlight-client==0.6.25
128 127
129 128 ## test related requirements
130 129 -r requirements_test.txt
@@ -1,373 +1,369 b''
1 1 {
2 2 "libnghttp2-1.7.1": {
3 3 "MIT License": "http://spdx.org/licenses/MIT"
4 4 },
5 5 "nodejs-4.3.1": {
6 6 "MIT License": "http://spdx.org/licenses/MIT"
7 7 },
8 8 "python-2.7.12": {
9 9 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
10 10 },
11 11 "python2.7-Babel-1.3": {
12 12 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
13 13 },
14 14 "python2.7-Beaker-1.7.0": {
15 15 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
16 16 },
17 17 "python2.7-Chameleon-2.24": {
18 18 "BSD-like": "http://repoze.org/license.html"
19 19 },
20 20 "python2.7-FormEncode-1.2.4": {
21 21 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
22 22 },
23 23 "python2.7-Jinja2-2.7.3": {
24 24 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
25 25 },
26 26 "python2.7-Mako-1.0.6": {
27 27 "MIT License": "http://spdx.org/licenses/MIT"
28 28 },
29 29 "python2.7-Markdown-2.6.7": {
30 30 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
31 31 },
32 32 "python2.7-MarkupSafe-0.23": {
33 33 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
34 34 },
35 35 "python2.7-Paste-2.0.3": {
36 36 "MIT License": "http://spdx.org/licenses/MIT"
37 37 },
38 38 "python2.7-PasteDeploy-1.5.2": {
39 39 "MIT License": "http://spdx.org/licenses/MIT"
40 40 },
41 41 "python2.7-PasteScript-1.7.5": {
42 42 "MIT License": "http://spdx.org/licenses/MIT"
43 43 },
44 44 "python2.7-Pygments-2.2.0": {
45 45 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
46 46 },
47 47 "python2.7-Routes-1.13": {
48 48 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
49 49 },
50 50 "python2.7-SQLAlchemy-0.9.9": {
51 51 "MIT License": "http://spdx.org/licenses/MIT"
52 52 },
53 53 "python2.7-Tempita-0.5.2": {
54 54 "MIT License": "http://spdx.org/licenses/MIT"
55 55 },
56 56 "python2.7-URLObject-2.4.0": {
57 57 "The Unlicense": "http://unlicense.org/"
58 58 },
59 59 "python2.7-WebError-0.10.3": {
60 60 "MIT License": "http://spdx.org/licenses/MIT"
61 61 },
62 62 "python2.7-WebHelpers-1.3": {
63 63 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
64 64 },
65 65 "python2.7-WebHelpers2-2.0": {
66 66 "MIT License": "http://spdx.org/licenses/MIT"
67 67 },
68 68 "python2.7-WebOb-1.3.1": {
69 69 "MIT License": "http://spdx.org/licenses/MIT"
70 70 },
71 71 "python2.7-Whoosh-2.7.4": {
72 72 "BSD 2-clause \"Simplified\" License": "http://spdx.org/licenses/BSD-2-Clause",
73 73 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
74 74 },
75 75 "python2.7-alembic-0.8.4": {
76 76 "MIT License": "http://spdx.org/licenses/MIT"
77 77 },
78 78 "python2.7-appenlight-client-0.6.14": {
79 79 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
80 80 },
81 81 "python2.7-authomatic-0.1.0.post1": {
82 82 "MIT License": "http://spdx.org/licenses/MIT"
83 83 },
84 84 "python2.7-backports.shutil-get-terminal-size-1.0.0": {
85 85 "MIT License": "http://spdx.org/licenses/MIT"
86 86 },
87 87 "python2.7-bleach-1.5.0": {
88 88 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
89 89 },
90 90 "python2.7-celery-2.2.10": {
91 91 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
92 92 },
93 93 "python2.7-channelstream-0.5.2": {
94 94 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
95 95 },
96 96 "python2.7-click-5.1": {
97 97 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
98 98 },
99 99 "python2.7-colander-1.2": {
100 100 "Repoze License": "http://www.repoze.org/LICENSE.txt"
101 101 },
102 102 "python2.7-configobj-5.0.6": {
103 103 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
104 104 },
105 105 "python2.7-configparser-3.5.0": {
106 106 "MIT License": "http://spdx.org/licenses/MIT"
107 107 },
108 108 "python2.7-cssselect-1.0.1": {
109 109 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
110 110 },
111 111 "python2.7-decorator-4.0.11": {
112 112 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
113 113 },
114 114 "python2.7-deform-2.0a2": {
115 115 "BSD-derived": "http://www.repoze.org/LICENSE.txt"
116 116 },
117 117 "python2.7-docutils-0.12": {
118 118 "BSD 2-clause \"Simplified\" License": "http://spdx.org/licenses/BSD-2-Clause"
119 119 },
120 120 "python2.7-dogpile.cache-0.6.1": {
121 121 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
122 122 },
123 123 "python2.7-dogpile.core-0.4.1": {
124 124 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
125 125 },
126 126 "python2.7-elasticsearch-2.3.0": {
127 127 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
128 128 },
129 129 "python2.7-elasticsearch-dsl-2.2.0": {
130 130 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
131 131 },
132 132 "python2.7-entrypoints-0.2.2": {
133 133 "MIT License": "http://spdx.org/licenses/MIT"
134 134 },
135 135 "python2.7-enum34-1.1.6": {
136 136 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
137 137 },
138 138 "python2.7-functools32-3.2.3.post2": {
139 139 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
140 140 },
141 141 "python2.7-future-0.14.3": {
142 142 "MIT License": "http://spdx.org/licenses/MIT"
143 143 },
144 144 "python2.7-futures-3.0.2": {
145 145 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
146 146 },
147 147 "python2.7-gevent-1.1.2": {
148 148 "MIT License": "http://spdx.org/licenses/MIT"
149 149 },
150 150 "python2.7-gnureadline-6.3.3": {
151 151 "GNU General Public License v1.0 only": "http://spdx.org/licenses/GPL-1.0"
152 152 },
153 153 "python2.7-gprof2dot-2016.10.13": {
154 154 "GNU Lesser General Public License v3.0 or later": "http://spdx.org/licenses/LGPL-3.0+"
155 155 },
156 156 "python2.7-greenlet-0.4.10": {
157 157 "MIT License": "http://spdx.org/licenses/MIT"
158 158 },
159 159 "python2.7-gunicorn-19.6.0": {
160 160 "MIT License": "http://spdx.org/licenses/MIT"
161 161 },
162 162 "python2.7-html5lib-0.9999999": {
163 163 "MIT License": "http://spdx.org/licenses/MIT"
164 164 },
165 165 "python2.7-infrae.cache-1.0.1": {
166 166 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
167 167 },
168 168 "python2.7-ipython-5.1.0": {
169 169 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
170 170 },
171 171 "python2.7-ipython-genutils-0.2.0": {
172 172 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
173 173 },
174 174 "python2.7-iso8601-0.1.11": {
175 175 "MIT License": "http://spdx.org/licenses/MIT"
176 176 },
177 177 "python2.7-itsdangerous-0.24": {
178 178 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
179 179 },
180 180 "python2.7-jsonschema-2.6.0": {
181 181 "MIT License": "http://spdx.org/licenses/MIT"
182 182 },
183 183 "python2.7-jupyter-client-5.0.0": {
184 184 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
185 185 },
186 186 "python2.7-jupyter-core-4.3.0": {
187 187 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
188 188 },
189 189 "python2.7-kombu-4.1.0": {
190 190 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
191 191 },
192 192 "python2.7-mistune-0.7.4": {
193 193 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
194 194 },
195 195 "python2.7-msgpack-python-0.4.8": {
196 196 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
197 197 },
198 198 "python2.7-nbconvert-5.1.1": {
199 199 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
200 200 },
201 201 "python2.7-nbformat-4.3.0": {
202 202 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
203 203 },
204 204 "python2.7-packaging-15.2": {
205 205 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
206 206 },
207 207 "python2.7-pandocfilters-1.4.1": {
208 208 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
209 209 },
210 210 "python2.7-pathlib2-2.1.0": {
211 211 "MIT License": "http://spdx.org/licenses/MIT"
212 212 },
213 213 "python2.7-peppercorn-0.5": {
214 214 "BSD-derived": "http://www.repoze.org/LICENSE.txt"
215 215 },
216 216 "python2.7-pexpect-4.2.1": {
217 217 "ISC License": "http://spdx.org/licenses/ISC"
218 218 },
219 219 "python2.7-pickleshare-0.7.4": {
220 220 "MIT License": "http://spdx.org/licenses/MIT"
221 221 },
222 222 "python2.7-prompt-toolkit-1.0.14": {
223 223 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
224 224 },
225 225 "python2.7-psutil-4.3.1": {
226 226 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
227 227 },
228 228 "python2.7-psycopg2-2.6.1": {
229 229 "GNU Lesser General Public License v3.0 or later": "http://spdx.org/licenses/LGPL-3.0+"
230 230 },
231 231 "python2.7-ptyprocess-0.5.1": {
232 232 "ISC License": "http://opensource.org/licenses/ISC"
233 233 },
234 234 "python2.7-py-1.4.31": {
235 235 "MIT License": "http://spdx.org/licenses/MIT"
236 236 },
237 237 "python2.7-py-bcrypt-0.4": {
238 238 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
239 239 },
240 240 "python2.7-py-gfm-0.1.3.rhodecode-upstream1": {
241 241 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
242 242 },
243 243 "python2.7-pycrypto-2.6.1": {
244 244 "Public Domain": null
245 245 },
246 246 "python2.7-pycurl-7.19.5": {
247 247 "MIT License": "http://spdx.org/licenses/MIT"
248 248 },
249 249 "python2.7-pygments-markdown-lexer-0.1.0.dev39": {
250 250 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
251 251 },
252 252 "python2.7-pyparsing-1.5.7": {
253 253 "MIT License": "http://spdx.org/licenses/MIT"
254 254 },
255 255 "python2.7-pyramid-1.7.4": {
256 256 "Repoze License": "http://www.repoze.org/LICENSE.txt"
257 257 },
258 258 "python2.7-pyramid-beaker-0.8": {
259 259 "Repoze License": "http://www.repoze.org/LICENSE.txt"
260 260 },
261 261 "python2.7-pyramid-debugtoolbar-3.0.5": {
262 262 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause",
263 263 "Repoze License": "http://www.repoze.org/LICENSE.txt"
264 264 },
265 265 "python2.7-pyramid-jinja2-2.5": {
266 266 "BSD-derived": "http://www.repoze.org/LICENSE.txt"
267 267 },
268 268 "python2.7-pyramid-mako-1.0.2": {
269 269 "Repoze License": "http://www.repoze.org/LICENSE.txt"
270 270 },
271 271 "python2.7-pysqlite-2.6.3": {
272 272 "libpng License": "http://spdx.org/licenses/Libpng",
273 273 "zlib License": "http://spdx.org/licenses/Zlib"
274 274 },
275 275 "python2.7-pytest-3.0.5": {
276 276 "MIT License": "http://spdx.org/licenses/MIT"
277 277 },
278 278 "python2.7-pytest-profiling-1.2.2": {
279 279 "MIT License": "http://spdx.org/licenses/MIT"
280 280 },
281 281 "python2.7-pytest-runner-2.9": {
282 282 "MIT License": "http://spdx.org/licenses/MIT"
283 283 },
284 284 "python2.7-pytest-sugar-0.7.1": {
285 285 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
286 286 },
287 287 "python2.7-pytest-timeout-1.2.0": {
288 288 "MIT License": "http://spdx.org/licenses/MIT"
289 289 },
290 290 "python2.7-python-dateutil-2.1": {
291 291 "Simplified BSD": null
292 292 },
293 293 "python2.7-python-editor-1.0.3": {
294 294 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
295 295 },
296 296 "python2.7-python-ldap-2.4.19": {
297 297 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
298 298 },
299 299 "python2.7-python-memcached-1.57": {
300 300 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
301 301 },
302 302 "python2.7-pytz-2015.4": {
303 303 "MIT License": "http://spdx.org/licenses/MIT"
304 304 },
305 305 "python2.7-pyzmq-14.6.0": {
306 306 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
307 307 },
308 308 "python2.7-repoze.lru-0.6": {
309 309 "Repoze License": "http://www.repoze.org/LICENSE.txt"
310 310 },
311 311 "python2.7-requests-2.9.1": {
312 312 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
313 },
314 "python2.7-setuptools-19.4": {
315 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0",
316 "Zope Public License 2.0": "http://spdx.org/licenses/ZPL-2.0"
317 },
313 },
318 314 "python2.7-setuptools-scm-1.15.6": {
319 315 "MIT License": "http://spdx.org/licenses/MIT"
320 316 },
321 317 "python2.7-simplegeneric-0.8.1": {
322 318 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
323 319 },
324 320 "python2.7-simplejson-3.7.2": {
325 321 "MIT License": "http://spdx.org/licenses/MIT"
326 322 },
327 323 "python2.7-six-1.9.0": {
328 324 "MIT License": "http://spdx.org/licenses/MIT"
329 325 },
330 326 "python2.7-subprocess32-3.2.6": {
331 327 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
332 328 },
333 329 "python2.7-termcolor-1.1.0": {
334 330 "MIT License": "http://spdx.org/licenses/MIT"
335 331 },
336 332 "python2.7-testpath-0.1": {
337 333 "MIT License": "http://spdx.org/licenses/MIT"
338 334 },
339 335 "python2.7-traitlets-4.3.2": {
340 336 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
341 337 },
342 338 "python2.7-translationstring-1.3": {
343 339 "Repoze License": "http://www.repoze.org/LICENSE.txt"
344 340 },
345 341 "python2.7-urllib3-1.16": {
346 342 "MIT License": "http://spdx.org/licenses/MIT"
347 343 },
348 344 "python2.7-venusian-1.0": {
349 345 "Repoze License": "http://www.repoze.org/LICENSE.txt"
350 346 },
351 347 "python2.7-waitress-1.0.1": {
352 348 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
353 349 },
354 350 "python2.7-wcwidth-0.1.7": {
355 351 "MIT License": "http://spdx.org/licenses/MIT"
356 352 },
357 353 "python2.7-ws4py-0.3.5": {
358 354 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
359 355 },
360 356 "python2.7-zope.cachedescriptors-4.0.0": {
361 357 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
362 358 },
363 359 "python2.7-zope.deprecation-4.1.2": {
364 360 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
365 361 },
366 362 "python2.7-zope.interface-4.1.3": {
367 363 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
368 364 },
369 365 "xz-5.2.2": {
370 366 "GNU General Public License v2.0 or later": "http://spdx.org/licenses/GPL-2.0+",
371 367 "GNU Library General Public License v2.1 or later": "http://spdx.org/licenses/LGPL-2.1+"
372 368 }
373 369 } No newline at end of file
@@ -1,83 +1,116 b''
1 # This file contains the adjustments which are desired for a development
2 # environment.
3
1 4 { pkgs ? (import <nixpkgs> {})
2 5 , pythonPackages ? "python27Packages"
3 , doCheck ? true
6 , doCheck ? false
4 7 , sourcesOverrides ? {}
5 8 , doDevelopInstall ? true
6 9 }:
7 10
8 11 let
9 12 # Get sources from config and update them with overrides.
10 13 sources = (pkgs.config.rc.sources or {}) // sourcesOverrides;
11 14
12 15 enterprise-ce = import ./default.nix {
13 inherit pkgs pythonPackages doCheck;
16 inherit
17 pkgs
18 pythonPackages
19 doCheck;
14 20 };
15 21
16 22 ce-pythonPackages = enterprise-ce.pythonPackages;
17 23
18 24 # This method looks up a path from `pkgs.config.rc.sources` and returns a
19 25 # shell script which does a `python setup.py develop` installation of it. If
20 26 # no path is found it will return an empty string.
21 27 optionalDevelopInstall = attributeName:
22 28 let
23 29 path = pkgs.lib.attrByPath [attributeName] null sources;
24 30 doIt = doDevelopInstall && path != null;
31
25 32 in
26 pkgs.lib.optionalString doIt (
27 builtins.trace "Develop install of ${attributeName} from ${path}" ''
28 echo "Develop install of '${attributeName}' from '${path}' [BEGIN]"
33 # do develop installation with empty hosts to skip any package duplicates to
34 # be replaced. This only pushes the package to be locally available
35 pkgs.lib.optionalString doIt (''
36 echo "[BEGIN] Develop install of '${attributeName}' from '${path}'"
29 37 pushd ${path}
30 38 python setup.py develop --prefix $tmp_path --allow-hosts ""
31 39 popd
32 echo "Develop install of '${attributeName}' from '${path}' [DONE]"
40 echo "[DONE] Develop install of '${attributeName}' from '${path}'"
41 echo ""
33 42 '');
34 43
35 44 # This method looks up a path from `pkgs.config.rc.sources` and imports the
36 45 # default.nix file if it exists. It returns the list of build inputs. If no
37 46 # path is found it will return an empty list.
38 47 optionalDevelopInstallBuildInputs = attributeName:
39 48 let
40 49 path = pkgs.lib.attrByPath [attributeName] null sources;
50 doIt = doDevelopInstall && path != null && pkgs.lib.pathExists "${nixFile}";
41 51 nixFile = "${path}/default.nix";
42 doIt = doDevelopInstall && path != null && pkgs.lib.pathExists "${nixFile}";
52
43 53 derivate = import "${nixFile}" {
44 54 inherit doCheck pkgs pythonPackages;
45 55 };
46 56 in
47 pkgs.lib.lists.optionals doIt derivate.propagatedNativeBuildInputs;
57 pkgs.lib.lists.optionals doIt (
58 derivate.propagatedBuildInputs
59 );
48 60
49 61 developInstalls = [ "rhodecode-vcsserver" ];
50 62
51 63 in enterprise-ce.override (attrs: {
52 64 # Avoid that we dump any sources into the store when entering the shell and
53 65 # make development a little bit more convenient.
54 66 src = null;
55 67
68 # Add dependencies which are useful for the development environment.
56 69 buildInputs =
57 70 attrs.buildInputs ++
58 pkgs.lib.lists.concatMap optionalDevelopInstallBuildInputs developInstalls ++
59 71 (with ce-pythonPackages; [
60 72 bumpversion
61 73 invoke
62 74 ipdb
63 75 ]);
64 76
65 # Somewhat snappier setup of the development environment
66 # TODO: think of supporting a stable path again, so that multiple shells
67 # can share it.
68 preShellHook = enterprise-ce.linkNodeAndBowerPackages + ''
77 # place to inject some required libs from develop installs
78 propagatedBuildInputs =
79 attrs.propagatedBuildInputs ++
80 pkgs.lib.lists.concatMap optionalDevelopInstallBuildInputs developInstalls;
81
82
83 # Make sure we execute both hooks
84 shellHook = ''
85 runHook preShellHook
86 runHook postShellHook
87 '';
88
89 preShellHook = ''
90 echo "Entering CE-Shell"
91
69 92 # Custom prompt to distinguish from other dev envs.
70 93 export PS1="\n\[\033[1;32m\][CE-shell:\w]$\[\033[0m\] "
71 94
95 echo "Building frontend assets"
96 ${enterprise-ce.linkNodeAndBowerPackages}
97
72 98 # Setup a temporary directory.
73 99 tmp_path=$(mktemp -d)
74 100 export PATH="$tmp_path/bin:$PATH"
75 101 export PYTHONPATH="$tmp_path/${ce-pythonPackages.python.sitePackages}:$PYTHONPATH"
76 102 mkdir -p $tmp_path/${ce-pythonPackages.python.sitePackages}
77 103
78 # Develop installations
104 # Develop installation
105 echo "[BEGIN]: develop install of rhodecode-enterprise-ce"
79 106 python setup.py develop --prefix $tmp_path --allow-hosts ""
80 echo "Additional develop installs"
81 '' + pkgs.lib.strings.concatMapStrings optionalDevelopInstall developInstalls;
107 '';
108
109 postShellHook = ''
110 echo "** Additional develop installs **"
111 '' +
112 pkgs.lib.strings.concatMapStrings optionalDevelopInstall developInstalls
113 + ''
114 '';
82 115
83 116 })
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now