Merge pull request #12473 from gleber/update-erlang-hex-packages

Erlang: update tooling and hex packages
This commit is contained in:
Peter Simons 2016-01-19 22:18:32 +01:00
commit 82b464820e
7 changed files with 2620 additions and 3264 deletions

View File

@ -3,6 +3,23 @@
xml:id="users-guide-to-the-erlang-infrastructure">
<title>User's Guide to the Erlang Infrastructure</title>
<section xml:id="build-tools">
<title>Build Tools</title>
<para>
By default Rebar3 wants to manage it's own dependencies. In the
normal non-Nix, this is perfectly acceptable. In the Nix world it
is not. To support this we have created two versions of rebar3,
<literal>rebar3</literal> and <literal>rebar3-open</literal>. The
<literal>rebar3</literal> version has been patched to remove the
ability to download anything from it. If you are not running it a
nix-shell or a nix-build then its probably not going to work for
you. <literal>rebar3-open</literal> is the normal, un-modified
rebar3. It should work exactly as would any other version of
rebar3. Any Erlang package should rely on
<literal>rebar3</literal> and thats really what you should be
using too.
</para>
</section>
<section xml:id="how-to-install-erlang-packages">
<title>How to install Erlang packages</title>

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
{ stdenv, writeText, callPackage, fetchurl,
fetchHex, erlang, rebar3-nix-bootstrap, tree, fetchFromGitHub }:
fetchHex, erlang, hermeticRebar3 ? true, rebar3-nix-bootstrap, tree, fetchFromGitHub }:
let
@ -67,6 +67,12 @@ let
version = "0.2.0";
sha256 = "03kiszlbgzscfd2ns7na6bzbfzmcqdb5cx3p6qy3657jk2fai332";
};
# {eunit_formatters, "0.2.0"}
rebar3_hex = fetchHex {
pkg = "rebar3_hex";
version = "1.12.0";
sha256 = "45467e93ae8d776c6038fdaeaffbc55d8f2f097f300a54dab9b81c6d1cf21f73";
};
in
stdenv.mkDerivation {
@ -78,7 +84,9 @@ stdenv.mkDerivation {
sha256 = "0px66scjdia9aaa5z36qzxb848r56m0k98g0bxw065a2narsh4xy";
};
patches = [ ./hermetic-bootstrap.patch ];
patches = if hermeticRebar3 == true
then [ ./hermetic-bootstrap.patch ./hermetic-rebar3.patch ]
else [];
buildInputs = [ erlang tree ];
propagatedBuildInputs = [ registrySnapshot rebar3-nix-bootstrap ];
@ -88,6 +96,7 @@ stdenv.mkDerivation {
rebar3-nix-bootstrap registry-only
echo "$ERL_LIBS"
mkdir -p _build/default/lib/
mkdir -p _build/default/plugins
cp --no-preserve=mode -R ${erlware_commons} _build/default/lib/erlware_commons
cp --no-preserve=mode -R ${providers} _build/default/lib/providers
cp --no-preserve=mode -R ${getopt} _build/default/lib/getopt
@ -98,6 +107,7 @@ stdenv.mkDerivation {
cp --no-preserve=mode -R ${eunit_formatters} _build/default/lib/eunit_formatters
cp --no-preserve=mode -R ${relx} _build/default/lib/relx
cp --no-preserve=mode -R ${ssl_verify_hostname} _build/default/lib/ssl_verify_hostname
cp --no-preserve=mode -R ${rebar3_hex} _build/default/plugins/rebar3_hex
'';
buildPhase = ''

View File

@ -0,0 +1,108 @@
diff --git a/src/rebar3.erl b/src/rebar3.erl
index 2b73844..af1d871 100644
--- a/src/rebar3.erl
+++ b/src/rebar3.erl
@@ -282,9 +282,11 @@ start_and_load_apps(Caller) ->
ensure_running(crypto, Caller),
ensure_running(asn1, Caller),
ensure_running(public_key, Caller),
- ensure_running(ssl, Caller),
- inets:start(),
- inets:start(httpc, [{profile, rebar}]).
+ ensure_running(ssl, Caller).
+%% Removed due to the hermicity requirements of Nix
+%%
+%% inets:start(),
+%% inets:start(httpc, [{profile, rebar}]).
ensure_running(App, Caller) ->
case application:start(App) of
@@ -339,4 +341,4 @@ safe_define_test_macro(Opts) ->
test_defined([{d, 'TEST'}|_]) -> true;
test_defined([{d, 'TEST', true}|_]) -> true;
test_defined([_|Rest]) -> test_defined(Rest);
-test_defined([]) -> false.
\ No newline at end of file
+test_defined([]) -> false.
diff --git a/src/rebar_hermicity.erl b/src/rebar_hermicity.erl
new file mode 100644
index 0000000..d814e2a
--- /dev/null
+++ b/src/rebar_hermicity.erl
@@ -0,0 +1,42 @@
+%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
+%% ex: ts=4 sw=4 et
+%% -------------------------------------------------------------------
+%%
+%% rebar: Erlang Build Tools
+%%
+%% Copyright (c) 2016 Eric Merritt (eric@merritt.tech)
+%%
+%% Permission is hereby granted, free of charge, to any person obtaining a copy
+%% of this software and associated documentation files (the "Software"), to deal
+%% in the Software without restriction, including without limitation the rights
+%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+%% copies of the Software, and to permit persons to whom the Software is
+%% furnished to do so, subject to the following conditions:
+%%
+%% The above copyright notice and this permission notice shall be included in
+%% all copies or substantial portions of the Software.
+%%
+%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+%% THE SOFTWARE.
+%% -------------------------------------------------------------------
+-module(rebar_hermicity).
+
+-export([request/5]).
+
+-include("rebar.hrl").
+
+%% ====================================================================
+%% Public API
+%% ====================================================================
+
+request(Method, {Url, _Headers}, _HTTPOptions, _Options, _Profile) ->
+ ?ERROR("A request is being made that violates Nix hermicity "
+ "This request has been stopped. Details of the request "
+ "are as follows:", []),
+ ?ERROR("Requesnt: ~p ~s", [Method, Url]),
+ erlang:halt(1).
diff --git a/src/rebar_pkg_resource.erl b/src/rebar_pkg_resource.erl
index 4f55ad1..f76fd5d 100644
--- a/src/rebar_pkg_resource.erl
+++ b/src/rebar_pkg_resource.erl
@@ -100,10 +100,10 @@ make_vsn(_) ->
{error, "Replacing version of type pkg not supported."}.
request(Url, ETag) ->
- case httpc:request(get, {Url, [{"if-none-match", ETag} || ETag =/= false]},
- [{ssl, ssl_opts(Url)}, {relaxed, true}],
- [{body_format, binary}],
- rebar) of
+ case rebar_hermicity:request(get, {Url, [{"if-none-match", ETag} || ETag =/= false]},
+ [{ssl, ssl_opts(Url)}, {relaxed, true}],
+ [{body_format, binary}],
+ rebar) of
{ok, {{_Version, 200, _Reason}, Headers, Body}} ->
?DEBUG("Successfully downloaded ~s", [Url]),
{"etag", ETag1} = lists:keyfind("etag", 1, Headers),
diff --git a/src/rebar_prv_update.erl b/src/rebar_prv_update.erl
index 6637ebe..d82c1d8 100644
--- a/src/rebar_prv_update.erl
+++ b/src/rebar_prv_update.erl
@@ -44,8 +44,8 @@ do(State) ->
TmpFile = filename:join(TmpDir, "packages.gz"),
Url = rebar_state:get(State, rebar_packages_cdn, ?DEFAULT_HEX_REGISTRY),
- case httpc:request(get, {Url, []},
- [], [{stream, TmpFile}, {sync, true}],
+ case rebar_hermicity:request(get, {Url, []},
+ [], [{stream, TmpFile}, {sync, true}],
rebar) of
{ok, saved_to_file} ->
{ok, Data} = file:read_file(TmpFile),

View File

@ -2,13 +2,13 @@
buildRebar3 rec {
name = "hex2nix";
version = "0.0.2";
version = "0.0.3";
src = fetchFromGitHub {
owner = "erlang-nix";
repo = "hex2nix";
rev = "${version}";
sha256 = "18gkq5fkdiwq5zj98cz4kqxbpzjkpqcplpsw987drxwdbvq4hkwm";
sha256 = "1snlcb60al7fz3z4c4rqrb9gqdyihyhsrr90n40v9rdm98csry3k";
};
erlangDeps = [ ibrowse jsx erlware_commons getopt ];

View File

@ -2,13 +2,13 @@
stdenv.mkDerivation rec {
name = "rebar3-nix-bootstrap";
version = "0.0.1";
version = "0.0.3";
src = fetchFromGitHub {
owner = "erlang-nix";
repo = "rebar3-nix-bootstrap";
rev = "${version}";
sha256 = "0xyj7j59dmxyl5nhhsmb0r1pihmk0s4k02ga1rfgm30rij6n7431";
sha256 = "01yyaz104jj3mxx8k10q3rwpn2rh13q1ja5r0iq37qyjmg8xflhq";
};
buildInputs = [ erlang ];

View File

@ -5102,7 +5102,8 @@ let
erlang_odbc_javac = erlangR18_odbc_javac;
rebar = callPackage ../development/tools/build-managers/rebar { };
rebar3 = callPackage ../development/tools/build-managers/rebar3 { };
rebar3-open = callPackage ../development/tools/build-managers/rebar3 { hermeticRebar3 = false; };
rebar3 = callPackage ../development/tools/build-managers/rebar3 { hermeticRebar3 = true; };
rebar3-nix-bootstrap = callPackage ../development/tools/erlang/rebar3-nix-bootstrap { };
fetchHex = callPackage ../development/tools/build-managers/rebar3/fetch-hex.nix { };