From b15a9b352797cc3760ab5cd76c6ff6224cedd01e Mon Sep 17 00:00:00 2001 From: Philipp Huebner Date: Sat, 8 Jan 2022 15:36:34 +0100 Subject: [PATCH] New upstream version 3.18.0 --- Dockerfile | 2 +- _build/default/lib/bbmustache/README.md | 2 +- _build/default/lib/bbmustache/rebar.config | 6 +- .../lib/bbmustache/src/bbmustache.app.src | 2 +- .../default/lib/bbmustache/src/bbmustache.erl | 75 ++-- _build/default/lib/certifi/priv/cacerts.pem | 349 +++++++++++++----- .../default/lib/certifi/src/certifi.app.src | 2 +- .../lib/certifi/test/certifi_tests.erl | 8 +- _build/default/lib/providers/README.md | 5 +- _build/default/lib/providers/rebar.config | 2 +- _build/default/lib/providers/rebar.lock | 14 +- .../lib/providers/src/providers.app.src | 2 +- .../default/lib/providers/src/providers.erl | 8 +- .../lib/relx/priv/templates/extended_bin | 43 ++- _build/default/lib/relx/rebar.config | 1 + _build/default/lib/relx/src/relx.app.src | 4 +- _build/default/lib/relx/src/relx.erl | 4 +- _build/default/lib/relx/src/rlx_app_info.erl | 21 +- _build/default/lib/relx/src/rlx_assemble.erl | 35 +- _build/default/lib/relx/src/rlx_overlay.erl | 2 +- _build/default/lib/relx/src/rlx_resolve.erl | 86 +++-- _build/default/lib/relx/src/rlx_util.erl | 2 +- bootstrap | 2 +- hex/packages.idx | Bin 60856 -> 61139 bytes priv/shell-completion/fish/rebar3.fish | 4 +- priv/templates/Makefile | 6 +- rebar.config | 10 +- rebar.lock | 24 +- src/rebar.app.src.script | 2 +- src/rebar3.erl | 19 +- src/rebar_api.erl | 2 +- src/rebar_app_discover.erl | 14 +- src/rebar_app_info.erl | 19 +- src/rebar_compiler_erl.erl | 10 +- src/rebar_compiler_mib.erl | 2 +- src/rebar_compiler_yrl.erl | 14 +- src/rebar_core.erl | 12 +- src/rebar_dialyzer_format.erl | 6 +- src/rebar_dir.erl | 4 +- src/rebar_erlc_compiler.erl | 2 +- src/rebar_git_resource.erl | 43 ++- src/rebar_hg_resource.erl | 4 +- src/rebar_packages.erl | 2 +- src/rebar_pkg_resource.erl | 2 +- src/rebar_prv_compile.erl | 2 +- src/rebar_prv_plugins_upgrade.erl | 23 +- src/rebar_prv_unlock.erl | 45 ++- src/rebar_prv_upgrade.erl | 34 +- src/rebar_relx.erl | 29 +- src/rebar_state.erl | 5 +- src/rebar_templater.erl | 2 +- src/rebar_utils.erl | 4 +- src/vendored/r3_hex_erl_tar.hrl | 4 +- .../all_SUITE_data/alias_clash/rebar.config | 2 +- test/rebar_alias_SUITE.erl | 4 +- test/rebar_compile_SUITE.erl | 43 +++ test/rebar_file_utils_SUITE.erl | 2 +- test/rebar_pkg_alias_SUITE.erl | 4 +- test/rebar_plugins_SUITE.erl | 12 +- test/rebar_release_SUITE.erl | 2 +- test/rebar_unlock_SUITE.erl | 11 +- test/rebar_upgrade_SUITE.erl | 18 +- 62 files changed, 776 insertions(+), 348 deletions(-) diff --git a/Dockerfile b/Dockerfile index b0c4165..f1609e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ FROM erlang:20.3.8.1-alpine as builder # "The LABEL instruction adds metadata to an image." LABEL stage=builder -# Install git for fetching non-hex depenencies. Also allows rebar3 +# Install git for fetching non-hex dependencies. Also allows rebar3 # to find it's own git version. # Add any other Alpine libraries needed to compile the project here. # See https://wiki.alpinelinux.org/wiki/Local_APK_cache for details diff --git a/_build/default/lib/bbmustache/README.md b/_build/default/lib/bbmustache/README.md index bb36f0c..a3af086 100644 --- a/_build/default/lib/bbmustache/README.md +++ b/_build/default/lib/bbmustache/README.md @@ -1,6 +1,6 @@ bbmustache =========== -[![Build Status](https://travis-ci.org/soranoba/bbmustache.svg?branch=master)](https://travis-ci.org/soranoba/bbmustache) +[![CircleCI](https://circleci.com/gh/soranoba/bbmustache/tree/master.svg?style=svg)](https://circleci.com/gh/soranoba/bbmustache/tree/master) [![hex.pm version](https://img.shields.io/hexpm/v/bbmustache.svg)](https://hex.pm/packages/bbmustache) Binary pattern match Based Mustache template engine for Erlang/OTP. diff --git a/_build/default/lib/bbmustache/rebar.config b/_build/default/lib/bbmustache/rebar.config index fbb3d8a..a14b258 100644 --- a/_build/default/lib/bbmustache/rebar.config +++ b/_build/default/lib/bbmustache/rebar.config @@ -2,6 +2,7 @@ {erl_opts, [ {platform_define, "^[0-9]+", namespaced_types}, + {platform_define, "^20", unicode_supported}, warnings_as_errors, warn_export_all, warn_untyped_record @@ -16,6 +17,7 @@ {edoc_opts, [ {doclet, edown_doclet}, + {app_default, "http://www.erlang.org/doc/man"}, {dialyzer_specs, all}, {report_missing_type, true}, {report_type_mismatch, true}, @@ -38,7 +40,7 @@ {deps, [ {jsone, "1.4.6"}, - {mustache_spec, ".*", {git, "git://github.com/soranoba/spec.git", {tag, "v1.1.3-erl"}}} + {mustache_spec, ".*", {git, "git://github.com/soranoba/spec.git", {tag, "v1.2.1-erl"}}} ]}, {plugins, [rebar3_raw_deps]} ]}, @@ -52,7 +54,7 @@ ]}, {doc, [{deps, [ - {edown, ".*", {git, "git://github.com/uwiger/edown.git", {branch, "master"}}} + {edown, ".*", {git, "git://github.com/uwiger/edown.git", {tag, "0.8.3"}}} ]} ]}, {bench, [{deps, diff --git a/_build/default/lib/bbmustache/src/bbmustache.app.src b/_build/default/lib/bbmustache/src/bbmustache.app.src index 87a9468..29327c1 100644 --- a/_build/default/lib/bbmustache/src/bbmustache.app.src +++ b/_build/default/lib/bbmustache/src/bbmustache.app.src @@ -1,6 +1,6 @@ {application,bbmustache, [{description,"Binary pattern match Based Mustache template engine for Erlang/OTP"}, - {vsn,"1.10.0"}, + {vsn,"1.12.2"}, {registered,[]}, {applications,[kernel,stdlib]}, {maintainers,["Hinagiku Soranoba"]}, diff --git a/_build/default/lib/bbmustache/src/bbmustache.erl b/_build/default/lib/bbmustache/src/bbmustache.erl index 2c7de0d..23c6f6a 100644 --- a/_build/default/lib/bbmustache/src/bbmustache.erl +++ b/_build/default/lib/bbmustache/src/bbmustache.erl @@ -70,23 +70,11 @@ %% %% In addition, `.' have a special meaning.
%% (1) `parent.child' ... find the child in the parent.
-%% (2) `.' ... It means this. However, the type of correspond is only `[integer() | float() | binary() | string() | atom()]'. Otherwise, the behavior is undefined. +%% (2) `.' ... It means current context. %% -type source() :: binary(). %% If you use lamda expressions, the original text is necessary. -%% -%% ``` -%% e.g. -%% template: -%% {{#lamda}}a{{b}}c{{/lamda}} -%% parse result: -%% {'#', <<"lamda">>, [<<"a">>, {'n', <<"b">>}, <<"c">>], <<"a{{b}}c">>} -%% ''' -%% -%% NOTE: -%% Since the binary reference is used internally, it is not a capacitively large waste. -%% However, the greater the number of tags used, it should use the wasted memory. -type tag() :: {n, [key()]} | {'&', [key()]} @@ -94,6 +82,19 @@ | {'^', [key()], [tag()]} | {'>', key(), Indent :: source()} | binary(). % plain text +%% Tag is the internal data structure of the result of parsing the mustache template. +%% +%% ``` +%% e.g. +%% template: +%% {{#lamda}}a{{b}}c{{/lamda}} +%% parse result: +%% {'#', [<<"lamda">>], [<<"a">>, {'n', <<"b">>}, <<"c">>], <<"a{{b}}c">>} +%% ''' +%% +%% NOTE: +%% Since the binary reference is used internally, it is not a capacitively large waste. +%% However, the greater the number of tags used, it uses the wasted memory. -record(?MODULE, { @@ -235,7 +236,7 @@ compile(Template, Data) -> %% All keys MUST be same type. -spec compile(template(), data(), [compile_option()]) -> binary(). compile(#?MODULE{data = Tags} = T, Data, Options) -> - Ret = compile_impl(Tags, Data, [], T#?MODULE{options = Options, data = []}), + Ret = compile_impl(Tags, Data, [], T#?MODULE{options = Options, data = [], context_stack = [Data]}), iolist_to_binary(lists:reverse(Ret)). %% @doc Default value serializer for templtated values @@ -246,10 +247,12 @@ default_value_serializer(Float) when is_float(Float) -> %% NOTE: It is the same behaviour as io_lib:format("~p", [Float]), but it is fast than. %% http://www.cs.indiana.edu/~dyb/pubs/FP-Printing-PLDI96.pdf io_lib_format:fwrite_g(Float); -default_value_serializer(Atom) when is_atom(Atom) -> - list_to_binary(atom_to_list(Atom)); default_value_serializer(X) when is_map(X); is_tuple(X) -> error(unsupported_term, [X]); +default_value_serializer(X) when X =:= null; X =:= nil -> + []; +default_value_serializer(X) when is_atom(X) -> + unicode:characters_to_binary(atom_to_list(X)); default_value_serializer(X) -> X. @@ -272,7 +275,7 @@ compile_impl([], _, Result, _) -> Result; compile_impl([{n, Keys} | T], Data, Result, State) -> ValueSerializer = proplists:get_value(value_serializer, State#?MODULE.options, fun default_value_serializer/1), - Value = iolist_to_binary(ValueSerializer(get_data_recursive(Keys, Data, <<>>, State))), + Value = unicode:characters_to_binary(ValueSerializer(get_data_recursive(Keys, Data, <<>>, State))), EscapeFun = proplists:get_value(escape_fun, State#?MODULE.options, fun escape/1), compile_impl(T, Data, ?ADD(EscapeFun(Value), Result), State); compile_impl([{'&', Keys} | T], Data, Result, State) -> @@ -280,24 +283,27 @@ compile_impl([{'&', Keys} | T], Data, Result, State) -> compile_impl(T, Data, ?ADD(ValueSerializer(get_data_recursive(Keys, Data, <<>>, State)), Result), State); compile_impl([{'#', Keys, Tags, Source} | T], Data, Result, State) -> Value = get_data_recursive(Keys, Data, false, State), - NestedState = State#?MODULE{context_stack = [Data | State#?MODULE.context_stack]}, - case is_recursive_data(Value) of - true -> + NestedState = State#?MODULE{context_stack = [Value | State#?MODULE.context_stack]}, + case {is_falsy(Value), is_recursive_data(Value)} of + {true, _} -> compile_impl(T, Data, Result, State); + {_, true} -> compile_impl(T, Data, compile_impl(Tags, Value, Result, NestedState), State); - _ when is_list(Value) -> - compile_impl(T, Data, lists:foldl(fun(X, Acc) -> compile_impl(Tags, X, Acc, NestedState) end, - Result, Value), State); - _ when Value =:= false -> - compile_impl(T, Data, Result, State); - _ when is_function(Value, 2) -> + _ when is_list(Value) -> + NextResult = lists:foldl(fun(X, Acc) -> + %% It doesn't need to add Value to context_stack because List is not context. + LoopState = State#?MODULE{context_stack = [X | State#?MODULE.context_stack]}, + compile_impl(Tags, X, Acc, LoopState) + end, Result, Value), + compile_impl(T, Data, NextResult, State); + _ when is_function(Value, 2) -> Ret = Value(Source, fun(Text) -> render(Text, Data, State#?MODULE.options) end), compile_impl(T, Data, ?ADD(Ret, Result), State); - _ -> - compile_impl(T, Data, compile_impl(Tags, Data, Result, State), State) + _ -> + compile_impl(T, Data, compile_impl(Tags, Value, Result, NestedState), State) end; compile_impl([{'^', Keys, Tags} | T], Data, Result, State) -> Value = get_data_recursive(Keys, Data, false, State), - case Value =:= [] orelse Value =:= false of + case is_falsy(Value) of true -> compile_impl(T, Data, compile_impl(Tags, Data, Result, State), State); false -> compile_impl(T, Data, Result, State) end; @@ -504,6 +510,11 @@ split_tag(#state{start = StartDelimiter, stop = StopDelimiter}, Bin) -> end end. +%% @doc Returns true if treated as false. Otherwise it returns false. +-spec is_falsy(term()) -> boolean(). +is_falsy(Value) -> + Value =:= [] orelse Value =:= false orelse Value =:= nil orelse Value =:= null orelse Value =:= <<"">>. + %% @doc if it is standalone line, remove spaces from edge. -spec standalone(#state{}, binary(), [tag()]) -> {#state{}, StashPre :: binary(), Post :: binary(), [tag()]}. standalone(#state{standalone = false} = State, Post, [Pre | Result]) -> @@ -632,7 +643,7 @@ convert_keytype(KeyBin, #?MODULE{options = Options}) -> %% @doc fetch the value of the specified `Keys' from {@link data/0} %% -%% - If `Keys' is `[<<".">>]', it returns `Data'. +%% - If `Keys' is `[<<".">>]', it returns current context. %% - If raise_on_context_miss enabled, it raise an exception when missing `Keys'. Otherwise, it returns `Default'. -spec get_data_recursive([key()], data(), Default :: term(), template()) -> term(). get_data_recursive(Keys, Data, Default, Template) -> @@ -649,8 +660,8 @@ get_data_recursive(Keys, Data, Default, Template) -> -spec get_data_recursive_impl([key()], data(), template()) -> {ok, term()} | error. get_data_recursive_impl([], Data, _) -> {ok, Data}; -get_data_recursive_impl([<<".">>], Data, _) -> - {ok, Data}; +get_data_recursive_impl([<<".">>], _, #?MODULE{context_stack = [Context | _]}) -> + {ok, Context}; get_data_recursive_impl([Key | RestKey] = Keys, Data, #?MODULE{context_stack = Stack} = State) -> case is_recursive_data(Data) andalso find_data(convert_keytype(Key, State), Data) of {ok, ChildData} -> diff --git a/_build/default/lib/certifi/priv/cacerts.pem b/_build/default/lib/certifi/priv/cacerts.pem index c754643..553f6ba 100644 --- a/_build/default/lib/certifi/priv/cacerts.pem +++ b/_build/default/lib/certifi/priv/cacerts.pem @@ -188,48 +188,6 @@ l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - # Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited # Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited # Label: "QuoVadis Root CA 2" @@ -345,33 +303,6 @@ JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== -----END CERTIFICATE----- -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - # Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Label: "XRamp Global CA Root" @@ -1593,35 +1524,6 @@ LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - # Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 # Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 # Label: "Buypass Class 2 Root CA" @@ -4207,3 +4109,254 @@ DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ 7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 +RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= -----END CERTIFICATE----- + +# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Label: "GLOBALTRUST 2020" +# Serial: 109160994242082918454945253 +# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 +# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 +# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG +A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw +FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx +MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u +aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b +RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z +YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 +QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw +yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ +BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ +SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH +r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 +4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me +dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw +q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 +nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu +H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC +XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd +6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf ++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi +kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 +wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB +TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C +MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn +4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I +aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy +qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Label: "ANF Secure Server Root CA" +# Serial: 996390341000653745 +# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 +# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 +# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV +BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk +YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV +BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN +MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF +UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD +VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v +dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj +cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q +yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH +2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX +H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL +zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR +p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz +W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/ +SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn +LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3 +n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B +u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L +9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej +rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK +pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0 +vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq +OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ +/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9 +2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI ++PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2 +MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo +tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + +# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum EC-384 CA" +# Serial: 160250656287871593594747141429395092468 +# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 +# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed +# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw +CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw +JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT +EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 +WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT +LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX +BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE +KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm +Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 +EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J +UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn +nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Root CA" +# Serial: 40870380103424195783807378461123655149 +# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 +# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 +# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6 +MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu +MScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV +BAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw +MzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg +U3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ +n0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q +p1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq +NwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF +8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3 +HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa +mqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi +7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF +ytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P +qafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ +v3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6 +Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD +ggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4 +WxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo +zMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR +5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ +GfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf +5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq +0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D +P78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM +qJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP +0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf +E2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Label: "TunTrust Root CA" +# Serial: 108534058042236574382096126452369648152337120275 +# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 +# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb +# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg +Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv +b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG +EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u +IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ +n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd +2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF +VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ +GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF +li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU +r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 +eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb +MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg +jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB +7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW +5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE +ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z +xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu +QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 +FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH +22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP +xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn +dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 +Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b +nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ +CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH +u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj +d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS RSA Root CA 2021" +# Serial: 76817823531813593706434026085292783742 +# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 +# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d +# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg +Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL +MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l +mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE +4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv +a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M +pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw +Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b +LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY +AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB +AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq +E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr +W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ +CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU +X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 +f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja +H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP +JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P +zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt +jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 +/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT +BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 +aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW +xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU +63ZTGI0RmLo= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS ECC Root CA 2021" +# Serial: 137515985548005187474074462014555733966 +# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 +# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 +# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw +CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh +cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v +dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG +A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 +KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y +STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw +SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN +nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- diff --git a/_build/default/lib/certifi/src/certifi.app.src b/_build/default/lib/certifi/src/certifi.app.src index fa41b0d..fa4b87e 100644 --- a/_build/default/lib/certifi/src/certifi.app.src +++ b/_build/default/lib/certifi/src/certifi.app.src @@ -1,6 +1,6 @@ {application,certifi, [{description,"CA bundle adapted from Mozilla by https://certifi.io"}, - {vsn,"2.6.1"}, + {vsn,"2.8.0"}, {registered,[]}, {applications,[kernel,stdlib]}, {env,[]}, diff --git a/_build/default/lib/certifi/test/certifi_tests.erl b/_build/default/lib/certifi/test/certifi_tests.erl index 8a6aee2..4ba2439 100644 --- a/_build/default/lib/certifi/test/certifi_tests.erl +++ b/_build/default/lib/certifi/test/certifi_tests.erl @@ -10,9 +10,9 @@ reproducible_module_test() -> cacerts_test_() -> Certs = [Cert1, Cert2, Cert3 | _] = certifi:cacerts(), - [?_assertEqual(127, length(Certs)) - ,?_assertMatch(<<48,130,2,11,48,130,1,145,160,3,2,1,2,2,18,17,210,187,186,51,_/binary>>, Cert1) - ,?_assertMatch(<<48,130,5,90,48,130,3,66,160,3,2,1,2,2,18,17,210,187,185,215,_/binary>>, Cert2) - ,?_assertMatch(<< 48,130,2,110,48,130,1,243,160,3,2,1,2,2,16,98,246,50,108, _ / binary>>, Cert3) + [?_assertEqual(128, length(Certs)) + ,?_assertMatch(<<48,130,5,192,48,130,3,168,160,3,2,1,2,2,16,30,191,89,80,184,_/binary>>, Cert1) + ,?_assertMatch(<<48,130,2,101,48,130,1,235,160,3,2,1,2,2,16,120,143,39,92,_/binary>>, Cert2) + ,?_assertMatch(<<48,130,5,239,48,130,3,215,160,3,2,1,2,2,8,13,211,227,188,_/binary>>, Cert3) ,?_assertMatch(<<48,130,3,117,48,130,2,93,160,3,2,1,2,2,11,4,0,0,0,0,1,21,75,90,195,148,48,13,6,_/binary>>, lists:last(Certs)) ]. diff --git a/_build/default/lib/providers/README.md b/_build/default/lib/providers/README.md index 5d8ec4c..c8f576e 100644 --- a/_build/default/lib/providers/README.md +++ b/_build/default/lib/providers/README.md @@ -1,6 +1,9 @@ -providers +providers [![GitHub Actions CI][ci-img]][ci] ===== +[ci]: https://github.com/tsloughter/providers +[ci-img]: https://github.com/tsloughter/providers/workflows/build/badge.svg + An Erlang providers library. Build diff --git a/_build/default/lib/providers/rebar.config b/_build/default/lib/providers/rebar.config index b8f31f0..113a566 100644 --- a/_build/default/lib/providers/rebar.config +++ b/_build/default/lib/providers/rebar.config @@ -1,5 +1,5 @@ {erl_opts, [{platform_define, "R14", no_callback_support} ,debug_info]}. -{deps, [{getopt, "1.0.1"}]}. +{deps, [{getopt, "1.0.1"}, {erlware_commons, "1.4.0"}]}. diff --git a/_build/default/lib/providers/rebar.lock b/_build/default/lib/providers/rebar.lock index eaf036f..2ada5fe 100644 --- a/_build/default/lib/providers/rebar.lock +++ b/_build/default/lib/providers/rebar.lock @@ -1,6 +1,14 @@ -{"1.1.0", -[{<<"getopt">>,{pkg,<<"getopt">>,<<"1.0.1">>},0}]}. +{"1.2.0", +[{<<"cf">>,{pkg,<<"cf">>,<<"0.3.1">>},1}, + {<<"erlware_commons">>,{pkg,<<"erlware_commons">>,<<"1.4.0">>},0}, + {<<"getopt">>,{pkg,<<"getopt">>,<<"1.0.1">>},0}]}. [ {pkg_hash,[ - {<<"getopt">>, <<"C73A9FA687B217F2FF79F68A3B637711BB1936E712B521D8CE466B29CBF7808A">>}]} + {<<"cf">>, <<"5CB902239476E141EA70A740340233782D363A31EEA8AD37049561542E6CD641">>}, + {<<"erlware_commons">>, <<"F9EE38412E1413944BE78736DDB9BDB4C0664ABA5133563F4F3B359A8ED0AD52">>}, + {<<"getopt">>, <<"C73A9FA687B217F2FF79F68A3B637711BB1936E712B521D8CE466B29CBF7808A">>}]}, +{pkg_hash_ext,[ + {<<"cf">>, <<"315E8D447D3A4B02BCDBFA397AD03BBB988A6E0AA6F44D3ADD0F4E3C3BF97672">>}, + {<<"erlware_commons">>, <<"185ECF5CF43BAB3A013DDB3614CE7BBA7F6C7A827904E64E57DA54FCDFDCE2E6">>}, + {<<"getopt">>, <<"53E1AB83B9CEB65C9672D3E7A35B8092E9BDC9B3EE80721471A161C10C59959C">>}]} ]. diff --git a/_build/default/lib/providers/src/providers.app.src b/_build/default/lib/providers/src/providers.app.src index 169c769..793050a 100644 --- a/_build/default/lib/providers/src/providers.app.src +++ b/_build/default/lib/providers/src/providers.app.src @@ -1,6 +1,6 @@ {application,providers, [{description,"Providers provider."}, - {vsn,"1.8.1"}, + {vsn,"1.9.0"}, {registered,[]}, {applications,[kernel,stdlib,getopt]}, {licenses,["Apache 2.0"]}, diff --git a/_build/default/lib/providers/src/providers.erl b/_build/default/lib/providers/src/providers.erl index 44d6d17..71d34d1 100644 --- a/_build/default/lib/providers/src/providers.erl +++ b/_build/default/lib/providers/src/providers.erl @@ -155,7 +155,7 @@ help(#provider{opts=Opts case Opts of [] -> - io:format("Usage: rebar3 ~s~p~n", [StrNS, Name]); + io:format("Usage: rebar3 ~ts~ts~n", [StrNS, Name]); _ -> getopt:usage(Opts, "rebar3 " ++ StrNS ++ atom_to_list(Name), "", []) end. @@ -172,7 +172,7 @@ help(Name, Providers, Namespace) when is_atom(Name) -> help(Provider). format_error({provider_not_found, Namespace, ProviderName}) -> - io_lib:format("Unable to resolve provider ~s in namespace ~s", [ProviderName, Namespace]). + io_lib:format("Unable to resolve provider ~ts in namespace ~ts", [ProviderName, Namespace]). %% @doc format an error produced from a provider. -spec format_error(t(), Reason::term()) -> iolist(). @@ -311,7 +311,7 @@ namespace_help(Dict, [NS|Namespaces]) -> if Help =:= [] -> no_public_providers; NS =/= default -> - io:format("~n~p :~n", [NS]), + io:format("~n~ts :~n", [NS]), display_help(Help); NS =:= default -> display_help(Help) @@ -323,5 +323,5 @@ display_help(Help) -> lists:foreach(fun({Name, ShortDesc}) -> Length = length(Name), Spacing = lists:duplicate(Longest - Length + 8, " "), - io:format("~s~s~s~n", [Name, Spacing, ShortDesc]) + io:format("~ts~ts~ts~n", [Name, Spacing, ShortDesc]) end, Help). diff --git a/_build/default/lib/relx/priv/templates/extended_bin b/_build/default/lib/relx/priv/templates/extended_bin index 01c4957..3fbee28 100644 --- a/_build/default/lib/relx/priv/templates/extended_bin +++ b/_build/default/lib/relx/priv/templates/extended_bin @@ -208,8 +208,8 @@ find_erts_dir() { __erts_version="$("$__erl" -boot no_dot_erlang -sasl errlog_type error -noshell -eval "$erts_version_code")" ERTS_DIR="${__erl_root}/erts-${__erts_version}" if [ -d "$ERTS_DIR" ]; then - ERTS_VSN=${__erts_version} echo "Exact ERTS version (${ERTS_VSN}) match not found, instead using ${__erts_version}. The release may fail to run." 1>&2 + ERTS_VSN=${__erts_version} else echo "Can not run the release. There is no ERTS bundled with the release or found on the system." exit 1 @@ -328,8 +328,8 @@ erl_rpc() { DYNAMIC_NAME="-r" fi - if [ "$ERL_DIST_PORT" ]; then - result=$("$ERL_RPC" "${DYNAMIC_NAME}" -c "${COOKIE}" -address "${ERL_DIST_PORT}" -timeout "${RELX_RPC_TIMEOUT}" -a "${command}") + if [ "$ADDRESS" ]; then + result=$("$ERL_RPC" "${DYNAMIC_NAME}" -c "${COOKIE}" -address "${ADDRESS}" -timeout "${RELX_RPC_TIMEOUT}" -a "${command}") else result=$("$ERL_RPC" "$NAME_TYPE" "$NAME" "${DYNAMIC_NAME}" -c "${COOKIE}" -timeout "${RELX_RPC_TIMEOUT}" -a "${command}") fi @@ -352,7 +352,7 @@ erl_eval() { command=$* if [ "$ERL_DIST_PORT" ]; then - result=$(echo "${command}" | "$ERL_RPC" "${DYNAMIC_NAME}" -c "${COOKIE}" -address "${ERL_DIST_PORT}" -timeout "${RELX_RPC_TIMEOUT}" -e) + result=$(echo "${command}" | "$ERL_RPC" "${DYNAMIC_NAME}" -c "${COOKIE}" -address "${ADDRESS}" -timeout "${RELX_RPC_TIMEOUT}" -e) else result=$(echo "${command}" | "$ERL_RPC" "$NAME_TYPE" "$NAME" "${DYNAMIC_NAME}" -c "${COOKIE}" -timeout "${RELX_RPC_TIMEOUT}" -e) fi @@ -410,6 +410,22 @@ relx_escript() { "$ERTS_DIR/bin/escript" "$ROOTDIR/$scriptpath" "$@" } +# Convert {127,0,0,1} to 127.0.0.1 (inet:ntoa/1) +addr_tuple_to_str() { + addr="$1" + saved_IFS="$IFS" + IFS="{,}'\" " + # shellcheck disable=SC2086 + eval set -- $addr + IFS="$saved_IFS" + + case $# in + 4) printf '%u.%u.%u.%u' "$@";; + 8) printf '%.4x:%.4x:%.4x:%.4x:%.4x:%.4x:%.4x:%.4x' "$@";; + *) echo "Cannot parse IP address tuple: '$addr'" 1>&2;; + esac +} + make_out_file_path() { # Use output directory provided in the RELX_OUT_FILE_PATH environment variable # (default to the current location of vm.args and sys.config) @@ -435,6 +451,7 @@ replace_os_vars() { slen=split(var,arr,":-") v=arr[1] e=ENVIRON[v] + gsub("&","\\\\\\&",e) if(slen > 1 && e=="") { i=index(var, ":-"arr[2]) def=substr(var,i+2) @@ -596,7 +613,7 @@ RELX_CONFIG_PATH=$(check_replace_os_vars sys.config "$RELX_CONFIG_PATH") # - nonexisting -args_files # - circular dependencies of -args_files # - relative paths in -args_file parameters -# - multiple/mixed occurences of -name and -sname parameters +# - multiple/mixed occurrences of -name and -sname parameters # - missing -name or -sname parameters # If all checks pass, extract the target node name set +e @@ -673,8 +690,17 @@ EPMD_MODULE="$(grep '^-epmd_module' "$VMARGS_PATH" || true)" if [ "$EPMD_MODULE" ]; then DIST_ARGS="${DIST_ARGS} ${EPMD_MODULE}" fi +INET_DIST_USE_INTERFACE="$(grep '^-kernel *inet_dist_use_interface' "$VMARGS_PATH" || true)" +if [ "$INET_DIST_USE_INTERFACE" ]; then + DIST_ARGS="${DIST_ARGS} ${INET_DIST_USE_INTERFACE}" +fi if [ "$ERL_DIST_PORT" ]; then + if [ "$INET_DIST_USE_INTERFACE" ]; then + ADDRESS="$(addr_tuple_to_str "${INET_DIST_USE_INTERFACE#*inet_dist_use_interface }"):$ERL_DIST_PORT" + else + ADDRESS="$ERL_DIST_PORT" + fi if [ "11.1" = "$(printf "%s\n11.1" "${ERTS_VSN}" | sort -V | head -n1)" ] ; then # unless set by the user, set start_epmd to false when ERL_DIST_PORT is used if [ ! "$START_EPMD" ]; then @@ -683,6 +709,13 @@ if [ "$ERL_DIST_PORT" ]; then EXTRA_DIST_ARGS="-erl_epmd_port ${ERL_DIST_PORT}" fi else + ERL_DIST_PORT_WARNING="ERL_DIST_PORT is set and used to set the port, but doing so on ERTS version ${ERTS_VSN} means remsh/rpc will not work for this release" + if ! command -v logger > /dev/null 2>&1 + then + echo "WARNING: ${ERL_DIST_PORT_WARNING}" + else + logger -p warning -t "${REL_NAME}[$$]" "${ERL_DIST_PORT_WARNING}" + fi EXTRA_DIST_ARGS="-kernel inet_dist_listen_min ${ERL_DIST_PORT} -kernel inet_dist_listen_max ${ERL_DIST_PORT}" fi fi diff --git a/_build/default/lib/relx/rebar.config b/_build/default/lib/relx/rebar.config index e7ce025..60b261e 100644 --- a/_build/default/lib/relx/rebar.config +++ b/_build/default/lib/relx/rebar.config @@ -45,6 +45,7 @@ %% used in tests {rlx_app_info, new, 5}, {rlx_app_info, new, 6}, + {rlx_app_info, new, 7}, {rlx_file_utils, type, 1}, {rlx_file_utils, write, 2}, {rlx_release, applications, 1}, diff --git a/_build/default/lib/relx/src/relx.app.src b/_build/default/lib/relx/src/relx.app.src index 0e33d21..6c5b171 100644 --- a/_build/default/lib/relx/src/relx.app.src +++ b/_build/default/lib/relx/src/relx.app.src @@ -1,8 +1,8 @@ {application,relx, [{description,"Release assembler for Erlang/OTP Releases"}, - {vsn,"4.5.0"}, + {vsn,"4.6.0"}, {modules,[]}, {registered,[]}, {applications,[kernel,stdlib,bbmustache]}, - {licenses,["Apache-2"]}, + {licenses,["Apache-2.0"]}, {links,[{"Github","https://github.com/erlware/relx"}]}]}. diff --git a/_build/default/lib/relx/src/relx.erl b/_build/default/lib/relx/src/relx.erl index 1faee18..ab3ca33 100644 --- a/_build/default/lib/relx/src/relx.erl +++ b/_build/default/lib/relx/src/relx.erl @@ -184,7 +184,7 @@ pick_release(State) -> pick_release_version(undefined, State) -> pick_release(State); pick_release_version(RelName, State) -> - %% Here we will just get the lastest version for name RelName and run that. + %% Here we will just get the latest version for name RelName and run that. AllReleases = maps:to_list(rlx_state:configured_releases(State)), SpecificReleases = [Rel || Rel={{PossibleRelName, _}, _} <- AllReleases, PossibleRelName =:= RelName], case lists:sort(fun release_sort/2, SpecificReleases) of @@ -202,7 +202,7 @@ release_sort({{RelName, RelVsnA}, _}, rlx_util:parsed_vsn_lte(rlx_util:parse_vsn(RelVsnB), rlx_util:parse_vsn(RelVsnA)); release_sort({{RelA, _}, _}, {{RelB, _}, _}) -> %% The release names are different. When the releases are named differently - %% we can not just take the lastest version. You *must* provide a default + %% we can not just take the latest version. You *must* provide a default %% release name at least. So we throw an error here that the top can catch %% and return error(?RLX_ERROR({multiple_release_names, RelA, RelB})). diff --git a/_build/default/lib/relx/src/rlx_app_info.erl b/_build/default/lib/relx/src/rlx_app_info.erl index 6f2774c..0ac20c1 100644 --- a/_build/default/lib/relx/src/rlx_app_info.erl +++ b/_build/default/lib/relx/src/rlx_app_info.erl @@ -38,11 +38,13 @@ -export([new/5, new/6, + new/7, name/1, vsn/1, dir/1, applications/1, included_applications/1, + optional_applications/1, link/1, link/2, format_error/1, @@ -57,6 +59,7 @@ applications := [atom()], included_applications := [atom()], + optional_applications := [atom()], dir := file:name() | undefined, link := boolean() | undefined, @@ -73,15 +76,23 @@ -spec new(atom(), string(), file:name(), [atom()], [atom()]) -> t(). new(Name, Vsn, Dir, Applications, IncludedApplications) -> - new(Name, Vsn, Dir, Applications, IncludedApplications, dep). + new(Name, Vsn, Dir, Applications, IncludedApplications, [], dep). --spec new(atom(), string(), file:name(), [atom()], [atom()], app_type()) -> t(). -new(Name, Vsn, Dir, Applications, IncludedApplications, AppType) -> +-spec new(atom(), string(), file:name(), [atom()], [atom()], [atom()] | atom()) -> t(). +new(Name, Vsn, Dir, Applications, IncludedApplications, OptionalApplications) + when is_list(OptionalApplications) -> + new(Name, Vsn, Dir, Applications, IncludedApplications, OptionalApplications, dep); +new(Name, Vsn, Dir, Applications, IncludedApplications, AppType) when is_atom(AppType) -> + new(Name, Vsn, Dir, Applications, IncludedApplications, [], AppType). + +-spec new(atom(), string(), file:name(), [atom()], [atom()], [atom()], app_type()) -> t(). +new(Name, Vsn, Dir, Applications, IncludedApplications, OptionalApplications, AppType) -> #{name => Name, vsn => Vsn, applications => Applications, included_applications => IncludedApplications, + optional_applications => OptionalApplications, dir => Dir, link => false, @@ -108,6 +119,10 @@ applications(#{applications := Deps}) -> included_applications(#{included_applications := Deps}) -> Deps. +-spec optional_applications(t()) -> [atom()]. +optional_applications(#{included_applications := Deps}) -> + Deps. + -spec link(t()) -> boolean(). link(#{link := Link}) -> Link. diff --git a/_build/default/lib/relx/src/rlx_assemble.erl b/_build/default/lib/relx/src/rlx_assemble.erl index c50888f..5a0230b 100644 --- a/_build/default/lib/relx/src/rlx_assemble.erl +++ b/_build/default/lib/relx/src/rlx_assemble.erl @@ -129,13 +129,20 @@ rewrite_app_file(State, App, TargetDir) -> Name = rlx_app_info:name(App), Applications = rlx_app_info:applications(App), IncludedApplications = rlx_app_info:included_applications(App), + OptionalApplications = rlx_app_info:optional_applications(App), %% TODO: should really read this in when creating rlx_app:t() and keep it AppFile = filename:join([TargetDir, "ebin", [Name, ".app"]]), - {ok, [{application, AppName, AppData0}]} = file:consult(AppFile), + ?log_debug("Rewriting .app file: ~s", [AppFile]), + [{application, AppName, AppData0}] = case file:consult(AppFile) of + {ok, AppTerms} -> + AppTerms; + {error, ConsultError} -> + erlang:error(?RLX_ERROR({consult_app_file, AppFile, ConsultError})) + end, %% maybe replace excluded apps - AppData1 = maybe_exclude_apps(Applications, IncludedApplications, + AppData1 = maybe_exclude_apps(Applications, IncludedApplications, OptionalApplications, AppData0, rlx_state:exclude_apps(State)), AppData2 = maybe_exclude_modules(AppData1, proplists:get_value(Name, @@ -150,17 +157,23 @@ rewrite_app_file(State, App, TargetDir) -> erlang:error(?RLX_ERROR({rewrite_app_file, AppFile, Error})) end. -maybe_exclude_apps(_Applications, _IncludedApplications, AppData, []) -> +maybe_exclude_apps(_Applications, _IncludedApplications, _OptionalApplications, AppData, []) -> AppData; -maybe_exclude_apps(Applications, IncludedApplications, AppData, ExcludeApps) -> +maybe_exclude_apps(Applications, IncludedApplications, OptionalApplications, AppData, ExcludeApps) -> AppData1 = lists:keyreplace(applications, 1, AppData, {applications, Applications -- ExcludeApps}), - lists:keyreplace(included_applications, + AppData2 = lists:keyreplace(included_applications, + 1, + AppData1, + {included_applications, IncludedApplications -- ExcludeApps}), + + %% not absolutely necessary since they are already seen as optional, but may as well + lists:keyreplace(optional_applications, 1, - AppData1, - {included_applications, IncludedApplications -- ExcludeApps}). + AppData2, + {optional_applications, OptionalApplications -- ExcludeApps}). maybe_exclude_modules(AppData, []) -> AppData; @@ -829,7 +842,7 @@ copy_to_start(RelDir, Name) -> ok -> ok; {error, Reason} -> - %% it isn't absolutely necesary for start.boot to exist so just warn + %% it isn't absolutely necessary for start.boot to exist so just warn ?log_warn("Unable to copy boot file ~s to start.boot: ~p", [BootFile, Reason]), ok end. @@ -1086,5 +1099,11 @@ format_error({strip_release, Reason}) -> format_error({rewrite_app_file, AppFile, Error}) -> io_lib:format("Unable to rewrite .app file ~s due to ~p", [AppFile, Error]); +format_error({consult_app_file, AppFile, enoent}) -> + io_lib:format("Unable to consult .app file ~ts (file not found).", + [AppFile]); +format_error({consult_app_file, AppFile, Error}) -> + io_lib:format("Unable to consult .app file ~ts due to ~ts", + [AppFile, file:format_error(Error)]); format_error({create_RELEASES, Reason}) -> io_lib:format("Unable to create RELEASES file needed by release_handler: ~p", [Reason]). diff --git a/_build/default/lib/relx/src/rlx_overlay.erl b/_build/default/lib/relx/src/rlx_overlay.erl index a3f6e82..077f635 100644 --- a/_build/default/lib/relx/src/rlx_overlay.erl +++ b/_build/default/lib/relx/src/rlx_overlay.erl @@ -214,7 +214,7 @@ generate_state_vars(Release, State) -> {vm_args, rlx_state:vm_args(State)}, {sys_config, rlx_state:sys_config(State)}, {root_dir, rlx_state:root_dir(State)} - %% include a var for each application. makes it easier to copy a file from an applcation + %% include a var for each application. makes it easier to copy a file from an application | [{rlx_app_info:name(AppInfo), rlx_app_info:dir(AppInfo)} || AppInfo <- rlx_release:applications(Release)]]. diff --git a/_build/default/lib/relx/src/rlx_resolve.erl b/_build/default/lib/relx/src/rlx_resolve.erl index 97b1b60..36f1b47 100644 --- a/_build/default/lib/relx/src/rlx_resolve.erl +++ b/_build/default/lib/relx/src/rlx_resolve.erl @@ -44,34 +44,63 @@ solve_release(Release, State0) -> {false, [SystemLibs | LibDirs]} end, - Pkgs = subset(Goals, AllApps, LibDirs1, CheckCodeLibDirs), - Pkgs1 = remove_exclude_apps(Pkgs, State1), - set_resolved(Release, Pkgs1, State1) + ExcludeApps = rlx_state:exclude_apps(State1), + Pkgs = subset(Goals, AllApps, LibDirs1, CheckCodeLibDirs, ExcludeApps), + set_resolved(Release, Pkgs, State1) end. %% find the app_info records for each application and its deps needed for the release -subset(Apps, World, LibDirs, CheckCodeLibDirs) -> - subset(Apps, World, sets:new(), LibDirs, CheckCodeLibDirs, []). +subset(Goals, World, LibDirs, CheckCodeLibDirs, ExcludeApps) -> + {Apps, _} = fold_apps(Goals, World, sets:new(), LibDirs, CheckCodeLibDirs, [], ExcludeApps), + Apps. -subset([], _World, _Seen, _LibDirs, _CheckCodeLibDirs, Acc) -> - Acc; -subset([Goal | Rest], World, Seen, LibDirs, CheckCodeLibDirs, Acc) -> +subset(Goal, World, Seen, LibDirs, CheckCodeLibDirs, OptionalApplications, ExcludeApps) -> {Name, Vsn} = name_version(Goal), case sets:is_element(Name, Seen) of true -> - subset(Rest, World, Seen, LibDirs, CheckCodeLibDirs, Acc); + {[], Seen}; _ -> - AppInfo=#{applications := Applications, - included_applications := IncludedApplications} = - find_app(Name, Vsn, World, LibDirs, CheckCodeLibDirs), - subset(Rest ++ Applications ++ IncludedApplications, - World, - sets:add_element(Name, Seen), - LibDirs, - CheckCodeLibDirs, - Acc ++ [AppInfo]) + case find_app(Name, Vsn, World, LibDirs, CheckCodeLibDirs) of + not_found -> + case lists:member(Name, OptionalApplications) of + true -> + %% don't add to Seen since optional applications are only + %% per-application and not global, so another app could + %% depend on this dependency + {[], Seen}; + false -> + erlang:error(?RLX_ERROR({app_not_found, Name, Vsn})) + end; + AppInfo=#{applications := Applications, + included_applications := IncludedApplications, + optional_applications := OptionalApplications0} -> + {Apps, Seen2} = fold_apps(Applications ++ IncludedApplications ++ OptionalApplications0, + World, + sets:add_element(Name, Seen), + LibDirs, + CheckCodeLibDirs, + OptionalApplications0, + ExcludeApps), + + %% don't add excluded apps + %% TODO: should an excluded app's deps also be excluded? + case lists:member(Name, ExcludeApps) of + true -> + {Apps, Seen2}; + false -> + %% place the deps of the App before it + {Apps ++ [AppInfo], Seen2} + end + end end. +fold_apps(Apps, World, Seen, LibDirs, CheckCodeLibDirs, OptionalApplications, ExcludeApps) -> + lists:foldl(fun(App, {AppAcc, SeenAcc}) -> + {NewApps, SeenAcc1} = subset(App, World, SeenAcc, LibDirs, + CheckCodeLibDirs, OptionalApplications, ExcludeApps), + %% put new apps after the existing list to keep the user defined order + {AppAcc ++ NewApps, SeenAcc1} + end, {[], Seen}, Apps). set_resolved(Release0, Pkgs, State) -> case rlx_release:realize(Release0, Pkgs) of @@ -100,19 +129,6 @@ name_version(Name) when is_atom(Name) -> name_version({Name, #{vsn := Vsn}}) -> {Name, Vsn}. -remove_exclude_apps(AllApps, State) -> - ExcludeApps = rlx_state:exclude_apps(State), - lists:foldl(fun(AppName, Acc) -> - find_and_remove(AppName, Acc) - end, AllApps, ExcludeApps). - -find_and_remove(_, []) -> - []; -find_and_remove(ExcludeName, [#{name := Name} | Rest]) when ExcludeName =:= Name -> - Rest; -find_and_remove(ExcludeName, [H | Rest]) -> - [H | find_and_remove(ExcludeName, Rest)]. - %% Applications are first searched for in the `Apps' variable which is a map %% of application name to `rlx_app_info' map. This variable is passed to `relx' %% function calls to build the release or tarball @@ -144,7 +160,7 @@ search_for_app(Name, Vsn, LibDirs, CheckCodeLibDirs) -> %% app not found in any lib dir we are configured to search %% and user set a custom `system_libs' directory so we do %% not look in `code:lib_dir' - erlang:error(?RLX_ERROR({app_not_found, Name, Vsn})); + not_found; AppInfo -> case check_app(Name, Vsn, AppInfo) of true -> @@ -175,13 +191,13 @@ find_app_in_dir(Name, Vsn, [Dir | Rest]) -> find_app_in_code_path(Name, Vsn) -> case code:lib_dir(Name) of {error, bad_name} -> - erlang:error(?RLX_ERROR({app_not_found, Name, Vsn})); + not_found; Dir -> case to_app(Name, Vsn, filename:join([Dir, "ebin", [Name, ".app"]])) of {true, AppInfo} -> AppInfo; false -> - erlang:error(?RLX_ERROR({app_not_found, Name, Vsn})) + not_found end end. @@ -200,6 +216,7 @@ to_app(Name, Vsn, AppFilePath) -> end, Applications = proplists:get_value(applications, AppData, []), IncludedApplications = proplists:get_value(included_applications, AppData, []), + OptionalApplications = proplists:get_value(optional_applications, AppData, []), case lists:keyfind(vsn, 1, AppData) of {_, Vsn1} when Vsn =:= undefined ; @@ -209,6 +226,7 @@ to_app(Name, Vsn, AppFilePath) -> applications => Applications, included_applications => IncludedApplications, + optional_applications => OptionalApplications, dir => filename:dirname(filename:dirname(AppFilePath)), link => false}}; diff --git a/_build/default/lib/relx/src/rlx_util.erl b/_build/default/lib/relx/src/rlx_util.erl index 41a5d9b..1b26f06 100644 --- a/_build/default/lib/relx/src/rlx_util.erl +++ b/_build/default/lib/relx/src/rlx_util.erl @@ -66,7 +66,7 @@ parse_vsn(Vsn) -> "(\\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$", [{capture, [1,2,4,6,8], list}]) of %% OTP application's leave out patch version when it is .0 %% this regex currently drops prerelease and build if the patch version is left out - %% so 3.11-0+meta would reutrn {{3,11,0},{[], []}} intsead of {{3,1,0},{"0","meta"}} + %% so 3.11-0+meta would return {{3,11,0},{[], []}} intsead of {{3,1,0},{"0","meta"}} {match, [Major, Minor, [], PreRelease, Build]} -> {{list_to_integer(Major), list_to_integer(Minor), 0}, {PreRelease, Build}}; {match, [Major, Minor, Patch, PreRelease, Build]} -> diff --git a/bootstrap b/bootstrap index 9632b6c..4564ae8 100755 --- a/bootstrap +++ b/bootstrap @@ -44,7 +44,7 @@ main(_) -> bootstrap_rebar3(), %% Build rebar.app from rebar.app.src - {ok, App} = rebar_app_info:new(rebar, "3.17.0", filename:absname("_build/default/lib/rebar/")), + {ok, App} = rebar_app_info:new(rebar, "3.18.0", filename:absname("_build/default/lib/rebar/")), rebar_otp_app:compile(rebar_state:new(), App), %% Because we are compiling files that are loaded already we want to silence diff --git a/hex/packages.idx b/hex/packages.idx index 9a5fb3781580576e58d2723c0dde78438aee01db..5a75483188935f4925aa195e429bfdfb6e213db1 100644 GIT binary patch delta 187 zcmWN@p-uxq5CG7-TymxgL|tOH@AZy(*Gn{~r*+BEI`VRb#;?AxdD^{#z6FWTSlY5RFKUCibW44j3) zrU0sdDH0lG&Z-fq7Oud?6mZ4nBvD1c7X%YDRRkMo-89XutCcKR4PY2Fxc>>ntmv{8 hN1hS`5d|bKUZSxXP_h&ceT)?iPrI+>`SR!3{{cdAGnxPZ delta 40 ycmV+@0N4N1-2=GW1CTNc0G4^HiU0vKu=FO8J%j;Ok-}O5z_T3z_2siI=%xl>GZBse diff --git a/priv/shell-completion/fish/rebar3.fish b/priv/shell-completion/fish/rebar3.fish index 9b68269..bdc3657 100644 --- a/priv/shell-completion/fish/rebar3.fish +++ b/priv/shell-completion/fish/rebar3.fish @@ -61,7 +61,7 @@ end ## ## plugins : ## list List local and global plugins for this project -## upgrade Uprade plugins +## upgrade Upgrade plugins ## ## Run 'rebar3 help ' for details. # general options @@ -190,7 +190,7 @@ complete -f -c 'rebar3' -n '__fish_rebar3_using_command tar' -l system_libs complete -f -c 'rebar3' -n '__fish_rebar3_using_command tar' -l version -d "Print relx version" complete -f -c 'rebar3' -n '__fish_rebar3_using_command tar' -s r -l root -d "The project root directory" -complete -f -c 'rebar3' -n '__fish_rebar3_needs_command' -a tree -d "Print depdency tree." +complete -f -c 'rebar3' -n '__fish_rebar3_needs_command' -a tree -d "Print dependency tree." complete -f -c 'rebar3' -n '__fish_rebar3_needs_command tree' -s v -l verbose -d "Print repo and branch/tag/ref for git and hg deps." diff --git a/priv/templates/Makefile b/priv/templates/Makefile index 1e9b6cb..fdfc4b2 100644 --- a/priv/templates/Makefile +++ b/priv/templates/Makefile @@ -18,9 +18,9 @@ C_SRC_OUTPUT ?= $(CURDIR)/../priv/$(PROJECT).so UNAME_SYS := $(shell uname -s) ifeq ($(UNAME_SYS), Darwin) CC ?= cc - CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes - CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall - LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress + CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes + CXXFLAGS ?= -O3 -finline-functions -Wall + LDFLAGS ?= -flat_namespace -undefined suppress else ifeq ($(UNAME_SYS), FreeBSD) CC ?= cc CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes diff --git a/rebar.config b/rebar.config index 0704380..f286e0a 100644 --- a/rebar.config +++ b/rebar.config @@ -3,11 +3,11 @@ {deps, [{erlware_commons, "1.5.0"}, {ssl_verify_fun, "1.1.6"}, - {certifi, "2.6.1"}, - {providers, "1.8.1"}, + {certifi, "2.8.0"}, + {providers, "1.9.0"}, {getopt, "1.0.1"}, - {bbmustache, "1.10.0"}, - {relx, "4.5.0"}, + {bbmustache, "1.12.2"}, + {relx, "4.6.0"}, {cf, "0.3.1"}, {cth_readable, "1.5.1"}, {eunit_formatters, "0.5.0"}]}. @@ -23,7 +23,7 @@ {escript_name, rebar3}. {escript_wrappers_windows, ["cmd", "powershell"]}. -{escript_comment, "%%Rebar3 3.17.0\n"}. +{escript_comment, "%%Rebar3 3.18.0\n"}. {escript_emu_args, "%%! +sbtu +A1\n"}. %% escript_incl_priv is for internal rebar-private use only. %% Do not use outside rebar. Config interface is not stable. diff --git a/rebar.lock b/rebar.lock index e98ff18..bc5d0ce 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,35 +1,35 @@ {"1.2.0", -[{<<"bbmustache">>,{pkg,<<"bbmustache">>,<<"1.10.0">>},0}, - {<<"certifi">>,{pkg,<<"certifi">>,<<"2.6.1">>},0}, +[{<<"bbmustache">>,{pkg,<<"bbmustache">>,<<"1.12.2">>},0}, + {<<"certifi">>,{pkg,<<"certifi">>,<<"2.8.0">>},0}, {<<"cf">>,{pkg,<<"cf">>,<<"0.3.1">>},0}, {<<"cth_readable">>,{pkg,<<"cth_readable">>,<<"1.5.1">>},0}, {<<"erlware_commons">>,{pkg,<<"erlware_commons">>,<<"1.5.0">>},0}, {<<"eunit_formatters">>,{pkg,<<"eunit_formatters">>,<<"0.5.0">>},0}, {<<"getopt">>,{pkg,<<"getopt">>,<<"1.0.1">>},0}, - {<<"providers">>,{pkg,<<"providers">>,<<"1.8.1">>},0}, - {<<"relx">>,{pkg,<<"relx">>,<<"4.5.0">>},0}, + {<<"providers">>,{pkg,<<"providers">>,<<"1.9.0">>},0}, + {<<"relx">>,{pkg,<<"relx">>,<<"4.6.0">>},0}, {<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.6">>},0}]}. [ {pkg_hash,[ - {<<"bbmustache">>, <<"DDC927463F0E95D66CDAC889153AF08015D609124D6D79006C248AD2DE7F6ECD">>}, - {<<"certifi">>, <<"DBAB8E5E155A0763EEA978C913CA280A6B544BFA115633FA20249C3D396D9493">>}, + {<<"bbmustache">>, <<"0CABDCE0DB9FE6D3318131174B9F2B351328A4C0AFBEB3E6E99BB0E02E9B621D">>}, + {<<"certifi">>, <<"D4FB0A6BB20B7C9C3643E22507E42F356AC090A1DCEA9AB99E27E0376D695EBA">>}, {<<"cf">>, <<"5CB902239476E141EA70A740340233782D363A31EEA8AD37049561542E6CD641">>}, {<<"cth_readable">>, <<"F511EFCFDE04A48B014A9197FFF1B4C4860E4E35CDB8E2F3AE3C4178E20299B1">>}, {<<"erlware_commons">>, <<"918C56D8FB3BE52AF0DF138ED6E0755E764AD4467CD7D025761F7D0A17D3DEC1">>}, {<<"eunit_formatters">>, <<"6A9133943D36A465D804C1C5B6E6839030434B8879C5600D7DDB5B3BAD4CCB59">>}, {<<"getopt">>, <<"C73A9FA687B217F2FF79F68A3B637711BB1936E712B521D8CE466B29CBF7808A">>}, - {<<"providers">>, <<"70B4197869514344A8A60E2B2A4EF41CA03DEF43CFB1712ECF076A0F3C62F083">>}, - {<<"relx">>, <<"2BF90A855023023EDD000641033D1AB9F4EBD4314D1739F691E16FE03CB35B85">>}, + {<<"providers">>, <<"46F6645B0C677B1029E02B013BFD69092A2232854DAF359F2378FA42AC0BEC0D">>}, + {<<"relx">>, <<"939DB831A63CC35A7850C99DCC758FE9F3900E32E1DAB7CBB34E5306CAF53168">>}, {<<"ssl_verify_fun">>, <<"CF344F5692C82D2CD7554F5EC8FD961548D4FD09E7D22F5B62482E5AEAEBD4B0">>}]}, {pkg_hash_ext,[ - {<<"bbmustache">>, <<"43EFFA3FD4BB9523157AF5A9E2276C493495B8459FC8737144AA186CB13CE2EE">>}, - {<<"certifi">>, <<"524C97B4991B3849DD5C17A631223896272C6B0AF446778BA4675A1DFF53BB7E">>}, + {<<"bbmustache">>, <<"688B33A4D5CC2D51F575ADF0B3683FC40A38314A2F150906EDCFC77F5B577B3B">>}, + {<<"certifi">>, <<"6AC7EFC1C6F8600B08D625292D4BBF584E14847CE1B6B5C44D983D273E1097EA">>}, {<<"cf">>, <<"315E8D447D3A4B02BCDBFA397AD03BBB988A6E0AA6F44D3ADD0F4E3C3BF97672">>}, {<<"cth_readable">>, <<"686541A22EFE6CA5A41A047B39516C2DD28FB3CADE5F24A2F19145B3967F9D80">>}, {<<"erlware_commons">>, <<"3E7C6FB2BA4C29B0DD5DFE9D031B66449E2088ECEC1A81465BD9FDE05ED7D0DB">>}, {<<"eunit_formatters">>, <<"D6C8BA213424944E6E05BBC097C32001CDD0ABE3925D02454F229B20D68763C9">>}, {<<"getopt">>, <<"53E1AB83B9CEB65C9672D3E7A35B8092E9BDC9B3EE80721471A161C10C59959C">>}, - {<<"providers">>, <<"E45745ADE9C476A9A469EA0840E418AB19360DC44F01A233304E118A44486BA0">>}, - {<<"relx">>, <<"DDB58F20CCE6CA63F5A2725E925816DD7213476698A3F3C3CB4FA8C272202C52">>}, + {<<"providers">>, <<"D287E874406A1505608642B0A3DB5B68D6ADA3F2AB001AEC87E7F4D7C79FC017">>}, + {<<"relx">>, <<"2FF8131C63093C621C6B37DC52D1B2848A938886584B4B701D35BDBE4377F509">>}, {<<"ssl_verify_fun">>, <<"BDB0D2471F453C88FF3908E7686F86F9BE327D065CC1EC16FA4540197EA04680">>}]} ]. diff --git a/src/rebar.app.src.script b/src/rebar.app.src.script index f2f6345..cd020e4 100644 --- a/src/rebar.app.src.script +++ b/src/rebar.app.src.script @@ -3,7 +3,7 @@ {application, rebar, [{description, "Rebar: Erlang Build Tool"}, - {vsn, "3.17.0"}, + {vsn, "3.18.0"}, {modules, []}, {registered, []}, {applications, [kernel, diff --git a/src/rebar3.erl b/src/rebar3.erl index 1c0f368..38126a4 100644 --- a/src/rebar3.erl +++ b/src/rebar3.erl @@ -160,18 +160,19 @@ run_aux(State, RawArgs) -> State4 = rebar_state:set(State3, base_dir, filename:join(filename:absname(rebar_state:dir(State3)), BaseDir)), + State5 = case os:getenv("REBAR_CACHE_DIR") of + false -> + State4; + ConfigFile -> + rebar_state:set(State4, global_rebar_dir, ConfigFile) + end, + {ok, Providers} = application:get_env(rebar, providers), %% Providers can modify profiles stored in opts, so set default after initializing providers - State5 = rebar_state:create_logic_providers(Providers, State4), + State6 = rebar_state:create_logic_providers(Providers, State5), %% Initializing project_plugins which can override default providers - State6 = rebar_plugins:project_plugins_install(State5), - State7 = rebar_plugins:top_level_install(State6), - State8 = case os:getenv("REBAR_CACHE_DIR") of - false -> - State7; - ConfigFile -> - rebar_state:set(State7, global_rebar_dir, ConfigFile) - end, + State7 = rebar_plugins:project_plugins_install(State6), + State8 = rebar_plugins:top_level_install(State7), State9 = rebar_state:default(State8, rebar_state:opts(State8)), diff --git a/src/rebar_api.erl b/src/rebar_api.erl index 373e65f..71ffa14 100644 --- a/src/rebar_api.erl +++ b/src/rebar_api.erl @@ -58,7 +58,7 @@ error(Str, Args) -> ?ERROR(Str, Args). expand_env_variable(InStr, VarName, RawVarValue) -> rebar_utils:expand_env_variable(InStr, VarName, RawVarValue). -%% @doc returns the sytem architecture, in strings like +%% @doc returns the system architecture, in strings like %% `"19.0.4-x86_64-unknown-linux-gnu-64"'. -spec get_arch() -> string(). get_arch() -> diff --git a/src/rebar_app_discover.erl b/src/rebar_app_discover.erl index a1400c6..3700e81 100644 --- a/src/rebar_app_discover.erl +++ b/src/rebar_app_discover.erl @@ -54,7 +54,7 @@ do(State, LibDirs) -> end, State, lists:reverse(CurrentProfiles)), %% Handle sub project apps deps - %% Sort apps so we get the same merged deps config everytime + %% Sort apps so we get the same merged deps config every time SortedApps = rebar_utils:sort_deps(Apps), lists:foldl(fun(AppInfo, StateAcc) -> Name = rebar_app_info:name(AppInfo), @@ -415,6 +415,7 @@ create_app_info(AppInfo, AppDir, AppFile) -> AppVsn = proplists:get_value(vsn, AppDetails), Applications = proplists:get_value(applications, AppDetails, []), IncludedApplications = proplists:get_value(included_applications, AppDetails, []), + OptionalApplications = proplists:get_value(optional_applications, AppDetails, []), AppInfo1 = rebar_app_info:name( rebar_app_info:vsn( rebar_app_info:original_vsn( @@ -422,14 +423,15 @@ create_app_info(AppInfo, AppDir, AppFile) -> AppInfo2 = rebar_app_info:applications( rebar_app_info:app_details(AppInfo1, AppDetails), Applications), AppInfo3 = rebar_app_info:included_applications(AppInfo2, IncludedApplications), - Valid = case rebar_app_utils:validate_application_info(AppInfo3) =:= true - andalso rebar_app_info:has_all_artifacts(AppInfo3) =:= true of + AppInfo4 = rebar_app_info:optional_applications(AppInfo3, OptionalApplications), + Valid = case rebar_app_utils:validate_application_info(AppInfo4) =:= true + andalso rebar_app_info:has_all_artifacts(AppInfo4) =:= true of true -> true; _ -> false end, - rebar_app_info:dir(rebar_app_info:valid(AppInfo3, Valid), AppDir); + rebar_app_info:dir(rebar_app_info:valid(AppInfo4, Valid), AppDir); _Invalid -> throw({error, {?MODULE, {cannot_read_app_file, AppFile}}}) catch @@ -438,7 +440,7 @@ create_app_info(AppInfo, AppDir, AppFile) -> end. -%% @doc Read in and parse the .app file if it is availabe. Do the same for +%% @doc Read in and parse the .app file if it is available. Do the same for %% the .app.src file if it exists. -spec try_handle_resource_files(AppInfo, AppDir, ResourceFiles, valid | invalid | all) -> {true, AppInfo} | false when @@ -463,7 +465,7 @@ try_handle_resource_files(_AppInfo, _AppDir, [], _Validate) -> false. -%% @doc Read in and parse the .app file if it is availabe. Do the same for +%% @doc Read in and parse the .app file if it is available. Do the same for %% the .app.src file if it exists. -spec try_handle_app_file(AppInfo, AppDir, File, AppSrcFile, valid | invalid | all) -> {true, AppInfo} | false when diff --git a/src/rebar_app_info.erl b/src/rebar_app_info.erl index dbe3624..4f78f43 100644 --- a/src/rebar_app_info.erl +++ b/src/rebar_app_info.erl @@ -32,6 +32,8 @@ applications/2, included_applications/1, included_applications/2, + optional_applications/1, + optional_applications/2, profiles/1, profiles/2, deps/1, @@ -94,6 +96,7 @@ app_details=[] :: list(), applications=[] :: list(), included_applications=[] :: [atom()], + optional_applications=[] :: [atom()], deps=[] :: list(), profiles=[default] :: [atom()], default=dict:new() :: rebar_dict(), @@ -119,7 +122,7 @@ %% API %% ============================================================================ %% @doc Build a new, empty, app info value. This is not of a lot of use and you -%% probably wont be doing this much. +%% probably won't be doing this much. -spec new() -> t(). new() -> #app_info_t{}. @@ -181,6 +184,7 @@ new(Parent, AppName, Vsn, Dir, Deps) -> vsn := app_vsn(), applications := [atom()], included_applications := [atom()], + optional_applications := [atom()], dir := file:name(), out_dir := file:name(), ebin_dir := file:name(), @@ -189,12 +193,14 @@ app_to_map(#app_info_t{name=Name, vsn=Vsn, applications=Applications, included_applications=IncludedApplications, + optional_applications=OptionalApplications, out_dir=OutDir, ebin_dir=EbinDir}) -> #{name => ec_cnv:to_atom(Name), vsn => Vsn, applications => Applications, included_applications => IncludedApplications, + optional_applications => OptionalApplications, dir => OutDir, out_dir => OutDir, ebin_dir => EbinDir, @@ -468,6 +474,17 @@ included_applications(#app_info_t{included_applications=Applications}) -> included_applications(AppInfo=#app_info_t{}, Applications) -> AppInfo#app_info_t{included_applications=Applications}. +%% @doc returns the list of optional_applications the app depends on. +-spec optional_applications(t()) -> list(). +optional_applications(#app_info_t{optional_applications=Applications}) -> + Applications. + +%% @doc sets the list of optional applications the app depends on. +%% Should be obtained from the app file. +-spec optional_applications(t(), list()) -> t(). +optional_applications(AppInfo=#app_info_t{}, Applications) -> + AppInfo#app_info_t{optional_applications=Applications}. + %% @doc returns the list of active profiles -spec profiles(t()) -> list(). profiles(#app_info_t{profiles=Profiles}) -> diff --git a/src/rebar_compiler_erl.erl b/src/rebar_compiler_erl.erl index 72795e1..d22cef4 100644 --- a/src/rebar_compiler_erl.erl +++ b/src/rebar_compiler_erl.erl @@ -63,7 +63,7 @@ needed_files(Graph, FoundFiles, _, AppInfo) -> NeededErlFiles = case needed_files(Graph, ErlOpts, RebarOpts, OutDir, EbinDir, ParseTransforms) of [] -> needed_files(Graph, ErlOpts, RebarOpts, OutDir, EbinDir, Rest); - _ -> + _ -> %% at least one parse transform in the opts needs updating, so recompile all FoundFiles end, @@ -258,6 +258,7 @@ target_base(OutDir, Source) -> filename:join(OutDir, filename:basename(Source, ".erl")). opts_changed(Graph, NewOpts, Target, TargetBase) -> + ModuleName = list_to_atom(filename:basename(TargetBase)), {ok, CompileVsn} = application:get_key(compiler, vsn), TotalOpts = case erlang:function_exported(compile, env_compiler_options, 0) of true -> [{compiler_version, CompileVsn}] ++ NewOpts ++ compile:env_compiler_options(); @@ -272,10 +273,10 @@ opts_changed(Graph, NewOpts, Target, TargetBase) -> _ -> [] end end, - lists:any(fun effects_code_generation/1, + lists:any(fun(Option) -> effects_code_generation(ModuleName, Option) end, lists:usort(TotalOpts) -- lists:usort(TargetOpts)). -effects_code_generation(Option) -> +effects_code_generation(ModuleName, Option) -> case Option of beam -> false; report_warnings -> false; @@ -288,6 +289,7 @@ effects_code_generation(Option) -> verbose -> false; {cwd,_} -> false; {outdir, _} -> false; + {parse_transform, ModuleName} -> false; no_spawn_compiler_process -> false; _ -> true end. @@ -334,7 +336,7 @@ atoms_in_erl_first_files_warning(Atoms) -> W = "You have provided atoms as file entries in erl_first_files; " "erl_first_files only expects lists of filenames as strings. " "The following modules (~p) may not work as expected and it is advised " - "that you change these entires to string format " + "that you change these entries to string format " "(e.g., \"src/module.erl\") ", ?WARN(W, [Atoms]). diff --git a/src/rebar_compiler_mib.erl b/src/rebar_compiler_mib.erl index e5db42b..62025cf 100644 --- a/src/rebar_compiler_mib.erl +++ b/src/rebar_compiler_mib.erl @@ -56,7 +56,7 @@ atoms_in_mib_first_files_warning(Atoms) -> W = "You have provided atoms as file entries in mib_first_files; " "mib_first_files only expects lists of filenames as strings. " "The following MIBs (~p) may not work as expected and it is advised " - "that you change these entires to string format " + "that you change these entries to string format " "(e.g., \"mibs/SOME-MIB.mib\") ", ?WARN(W, [Atoms]). diff --git a/src/rebar_compiler_yrl.erl b/src/rebar_compiler_yrl.erl index 8e52d0e..c6392ae 100644 --- a/src/rebar_compiler_yrl.erl +++ b/src/rebar_compiler_yrl.erl @@ -32,10 +32,16 @@ needed_files(_, FoundFiles, Mappings, AppInfo) -> dependencies(_, _, _) -> []. -compile(Source, [{_, OutDir}], _, Opts) -> - BaseName = filename:basename(Source, ".yrl"), - Target = filename:join([OutDir, BaseName]), - AllOpts = [{parserfile, Target}, {return, true} | Opts], +compile(Source, [{_, OutDir}], _, Opts0) -> + Opts = case proplists:get_value(parserfile, Opts0) of + undefined -> + BaseName = filename:basename(Source, ".yrl"), + Target = filename:join([OutDir, BaseName]), + [{parserfile, Target} | Opts0]; + _ -> + Opts0 + end, + AllOpts = [{return, true} | Opts], case yecc:file(Source, AllOpts) of {ok, _} -> ok; diff --git a/src/rebar_core.erl b/src/rebar_core.erl index d5114bf..588c201 100644 --- a/src/rebar_core.erl +++ b/src/rebar_core.erl @@ -68,7 +68,7 @@ process_namespace(State, Command) -> not_found -> case providers:get_providers_by_namespace(Command, Providers) of [] -> - {error, io_lib:format("Command ~p not found", [Command])}; + {error, io_lib:format("Command ~ts not found", [atom_to_list(Command)])}; _ -> %% Replay 'do' as a command of that namespace {ok, rebar_state:namespace(State, Command), do} @@ -98,10 +98,10 @@ process_command(State, Command) -> not_found when Command =/= do -> case Namespace of default -> - {error, io_lib:format("Command ~p not found", [Command])}; + {error, io_lib:format("Command ~ts not found", [atom_to_list(Command)])}; _ -> - {error, io_lib:format("Command ~p not found in namespace ~p", - [Command, Namespace])} + {error, io_lib:format("Command ~ts not found in namespace ~ts", + [atom_to_list(Command), atom_to_list(Namespace)])} end; not_found when Command =:= do, Namespace =/= default -> do([{default, do} | TargetProviders], State); @@ -120,7 +120,7 @@ process_command(State, Command) -> State2 = rebar_state:command_parsed_args(State1, Args), do(TargetProviders, State2); {error, {invalid_option, Option}} -> - {error, io_lib:format("Invalid option ~ts on task ~p", [Option, Command])}; + {error, io_lib:format("Invalid option ~ts on task ~ts", [Option, atom_to_list(Command)])}; {error, {invalid_option_arg, {Option, Arg}}} -> {error, io_lib:format("Invalid argument ~ts to option ~ts", [Arg, Option])}; {error, {missing_option_arg, Option}} -> @@ -137,7 +137,7 @@ process_command(State, Command) -> do([], State) -> {ok, State}; do([ProviderName | Rest], State) -> - ?DEBUG("Running provider: ~p", [friendly_provider(ProviderName)]), + ?DEBUG("Running provider: ~tp", [friendly_provider(ProviderName)]), %% Special providers like 'as', 'do' or some hooks may be passed %% as a tuple {Namespace, Name}, otherwise not. Handle them %% on a per-need basis. diff --git a/src/rebar_dialyzer_format.erl b/src/rebar_dialyzer_format.erl index 678ef34..afc7e0f 100644 --- a/src/rebar_dialyzer_format.erl +++ b/src/rebar_dialyzer_format.erl @@ -8,7 +8,7 @@ %%% out the cody bits %%% * red: things that went bad, i.e. the wrong argument in a %%% call. It allows to quickly catching where in the code -%%% ane error is. +%%% and error is. %%% * green: the 'good' stuff, i.e. what was expected as an argument %%% the 'red vs green' resambles the diff view 'remove vs add' %%% * blue: argument positions. @@ -412,14 +412,14 @@ highlight([N | Nr], N, r, [Arg | Rest]) -> highlight(Ns, N, C, [Arg | Rest]) -> [Arg | highlight(Ns, N + 1, C, Rest)]. -%% Arugments to functions and constraints are passed as +%% Arguments to functions and constraints are passed as %% strings not as data, this function pulls them apart %% to allow interacting with them separately and not %% as one bug chunk of data. separate_args([$( | S]) -> separate_args([], S, "", []). -%% We strip this space since dialyzer is inconsistant in adding or not adding +%% We strip this space since dialyzer is inconsistent in adding or not adding %% it .... separate_args([], [$,, $\s | R], Arg, Args) -> separate_args([], R, [], [lists:reverse(Arg) | Args]); diff --git a/src/rebar_dir.erl b/src/rebar_dir.erl index a27484d..abd4122 100644 --- a/src/rebar_dir.erl +++ b/src/rebar_dir.erl @@ -292,8 +292,8 @@ all_src_dirs(Opts, SrcDefault, ExtraDefault) -> %%% @doc %%% Return the list of options for the given src directory %%% If the same option is given multiple times for a directory in the -%%% config, the priority order is: first occurence of `src_dirs' -%%% followed by first occurence of `extra_src_dirs'. +%%% config, the priority order is: first occurrence of `src_dirs' +%%% followed by first occurrence of `extra_src_dirs'. -spec src_dir_opts(rebar_dict(), file:filename_all()) -> [{atom(),term()}]. src_dir_opts(Opts, Dir) -> RawSrcDirs = raw_src_dirs(src_dirs, Opts, []), diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl index 6bf4a36..a1942c5 100644 --- a/src/rebar_erlc_compiler.erl +++ b/src/rebar_erlc_compiler.erl @@ -831,7 +831,7 @@ atoms_in_erl_first_files_warning(Atoms) -> W = "You have provided atoms as file entries in erl_first_files; " "erl_first_files only expects lists of filenames as strings. " "The following modules (~p) may not work as expected and it is advised " - "that you change these entires to string format " + "that you change these entries to string format " "(e.g., \"src/module.erl\") ", ?WARN(W, [Atoms]). diff --git a/src/rebar_git_resource.erl b/src/rebar_git_resource.erl index 52c6c85..26d5120 100644 --- a/src/rebar_git_resource.erl +++ b/src/rebar_git_resource.erl @@ -17,7 +17,7 @@ make_vsn_/1, git_vsn/0]). -%% For backward compatibilty +%% For backward compatibility -export ([download/3]). -include("rebar.hrl"). @@ -141,7 +141,7 @@ download(TmpDir, AppInfo, State, _) -> {error, Error} end. -%% For backward compatibilty +%% For backward compatibility download(Dir, AppInfo, State) -> download_(Dir, AppInfo, State). @@ -180,7 +180,16 @@ maybe_warn_local_url(Url) -> end. %% Use different git clone commands depending on git --version -git_clone(branch, GitVsn, Url, Dir, Branch) when GitVsn >= {1,7,10}; GitVsn =:= undefined -> +git_clone(branch, GitVsn, Url, Dir, Branch) when GitVsn >= {2,3,0}; GitVsn =:= undefined -> + rebar_utils:sh(?FMT("git clone ~ts ~ts ~ts -b ~ts --single-branch", + [git_clone_options(), + rebar_utils:escape_chars(Url), + rebar_utils:escape_chars(filename:basename(Dir)), + rebar_utils:escape_chars(Branch)]), + [{cd, filename:dirname(Dir)}, + {env, [{"GIT_TERMINAL_PROMPT", "0"}]}]), + ok; +git_clone(branch, GitVsn, Url, Dir, Branch) when GitVsn >= {1,7,10} -> rebar_utils:sh(?FMT("git clone ~ts ~ts ~ts -b ~ts --single-branch", [git_clone_options(), rebar_utils:escape_chars(Url), @@ -196,7 +205,16 @@ git_clone(branch, _GitVsn, Url, Dir, Branch) -> rebar_utils:escape_chars(Branch)]), [{cd, filename:dirname(Dir)}]), ok; -git_clone(tag, GitVsn, Url, Dir, Tag) when GitVsn >= {1,7,10}; GitVsn =:= undefined -> +git_clone(tag, GitVsn, Url, Dir, Tag) when GitVsn >= {2,3,0}; GitVsn =:= undefined -> + rebar_utils:sh(?FMT("git clone ~ts ~ts ~ts -b ~ts --single-branch", + [git_clone_options(), + rebar_utils:escape_chars(Url), + rebar_utils:escape_chars(filename:basename(Dir)), + rebar_utils:escape_chars(Tag)]), + [{cd, filename:dirname(Dir)}, + {env, [{"GIT_TERMINAL_PROMPT", "0"}]}]), + ok; +git_clone(tag, GitVsn, Url, Dir, Tag) when GitVsn >= {1,7,10} -> rebar_utils:sh(?FMT("git clone ~ts ~ts ~ts -b ~ts --single-branch", [git_clone_options(), rebar_utils:escape_chars(Url), @@ -335,11 +353,17 @@ get_patch_count(Dir, RawRef) -> Ref = re:replace(RawRef, "\\s", "", [global, unicode]), Cmd = io_lib:format("git rev-list --count ~ts..HEAD", [rebar_utils:escape_chars(Ref)]), - {ok, PatchLines} = rebar_utils:sh(Cmd, - [{use_stdout, false}, - {cd, Dir}, - {debug_abort_on_error, AbortMsg}]), - {ok, list_to_integer(rebar_string:trim(PatchLines))}. + {ok, Output} = rebar_utils:sh(Cmd, + [{use_stdout, false}, + {cd, Dir}, + {debug_abort_on_error, AbortMsg}]), + case rebar_string:split(Output, "\n") of + [PatchLines, []] -> + {ok, list_to_integer(PatchLines)}; + [Warning, PatchLines] -> + ?WARN("Extra message from git rev-list: ~ts", [Warning]), + {ok, list_to_integer(rebar_string:trim(PatchLines))} + end. parse_tags(Dir) -> @@ -390,4 +414,3 @@ check_type_support() -> ok end end. - diff --git a/src/rebar_hg_resource.erl b/src/rebar_hg_resource.erl index 5ae1ee0..d92a4aa 100644 --- a/src/rebar_hg_resource.erl +++ b/src/rebar_hg_resource.erl @@ -11,7 +11,7 @@ make_vsn/2]). -%% For backward compatibilty +%% For backward compatibility -export([ download/3 ]). @@ -77,7 +77,7 @@ download(TmpDir, AppInfo, State, _) -> {error, Error} end. -%% For backward compatibilty +%% For backward compatibility download(Dir, AppInfo, State) -> download_(Dir, AppInfo, State). diff --git a/src/rebar_packages.erl b/src/rebar_packages.erl index ffa1055..5f39ac3 100644 --- a/src/rebar_packages.erl +++ b/src/rebar_packages.erl @@ -428,7 +428,7 @@ cmp_(BestMatch, MinVsn, [Vsn | R], CmpFun) -> end. %% We need to treat this differently since we want a version that is LOWER but -%% the higest possible one. +%% the highest possible one. cmpl(Dep, Vsn, Repo, HexRegistry, State, CmpFun) -> case get_package_versions(Dep, Vsn, Repo, HexRegistry, State) of [] -> diff --git a/src/rebar_pkg_resource.erl b/src/rebar_pkg_resource.erl index f2f779a..e9983a6 100644 --- a/src/rebar_pkg_resource.erl +++ b/src/rebar_pkg_resource.erl @@ -135,7 +135,7 @@ format_error({bad_registry_checksum, Name, Vsn, Expected, Found}) -> %% Download the pkg belonging to the given address. If the etag of the pkg %% is the same what we stored in the etag file previously return {ok, cached}, %% if the file has changed (so the etag is not the same anymore) return -%% {ok, Contents, NewEtag}, otherwise if some error occured return error. +%% {ok, Contents, NewEtag}, otherwise if some error occurred return error. %% @end %%------------------------------------------------------------------------------ -spec request(rebar_hex_repos:repo(), binary(), binary(), false | binary()) diff --git a/src/rebar_prv_compile.erl b/src/rebar_prv_compile.erl index 5532396..bf4b015 100644 --- a/src/rebar_prv_compile.erl +++ b/src/rebar_prv_compile.erl @@ -340,7 +340,7 @@ build_custom_builder_app(AppInfo, State) -> ProjectBuilders = rebar_state:project_builders(State), case lists:keyfind(Type, 1, ProjectBuilders) of {_, Module} -> - %% load plugins since thats where project builders would be, + %% load plugins since that's where project builders would be, %% prevents parallelism at this level. rebar_paths:set_paths([deps, plugins], State), Res = Module:build(AppInfo), diff --git a/src/rebar_prv_plugins_upgrade.erl b/src/rebar_prv_plugins_upgrade.erl index 7b24815..d2e5426 100644 --- a/src/rebar_prv_plugins_upgrade.erl +++ b/src/rebar_prv_plugins_upgrade.erl @@ -25,16 +25,18 @@ init(State) -> {deps, ?DEPS}, {example, "rebar3 plugins upgrade "}, {short_desc, "Upgrade plugins"}, - {desc, "List or upgrade plugins"}, + {desc, "List or upgrade plugins. Use the -a/--all option to upgrade" + " all plugins."}, {opts, [{plugin, undefined, undefined, string, - "Plugin to upgrade"}]}])), + "Plugin to upgrade"}, + {all, $a, "all", undefined, "Upgrade all plugins."}]}])), {ok, State1}. -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. do(State) -> - {Args, _} = rebar_state:command_parsed_args(State), - case proplists:get_value(plugin, Args, none) of - none -> + case handle_args(State) of + {false, undefined} -> throw(?PRV_ERROR(no_arg)); + {true, _} -> {_, LocalPluginsNames} = rebar_prv_plugins:list_local_plugins(State), lists:foldl( fun (LocalPluginName, {ok, StateAcc}) -> @@ -42,16 +44,23 @@ do(State) -> end, {ok, State}, LocalPluginsNames); - Plugin -> - upgrade(Plugin, State) + {false, Plugin} -> upgrade(Plugin, State) end. -spec format_error(any()) -> iolist(). format_error({not_found, Plugin}) -> io_lib:format("Plugin to upgrade not found: ~ts", [Plugin]); +format_error(no_arg) -> + "Specify a plugin to upgrade, or --all to upgrade them all"; format_error(Reason) -> io_lib:format("~p", [Reason]). +handle_args(State) -> + {Args, _} = rebar_state:command_parsed_args(State), + All = proplists:get_value(all, Args, false), + Plugin = proplists:get_value(plugin, Args), + {All, Plugin}. + upgrade(Plugin, State) -> Profiles = rebar_state:current_profiles(State), case find_plugin(Plugin, Profiles, State) of diff --git a/src/rebar_prv_unlock.erl b/src/rebar_prv_unlock.erl index 6fe8bd8..f0b2298 100644 --- a/src/rebar_prv_unlock.erl +++ b/src/rebar_prv_unlock.erl @@ -26,12 +26,12 @@ init(State) -> {deps, ?DEPS}, {example, ""}, {short_desc, "Unlock dependencies."}, - {desc, "Unlock project dependencies. Mentioning no application " - "will unlock all dependencies. To unlock specific dependencies, " + {desc, "Unlock project dependencies. Use the --all option " + "to unlock all dependencies. To unlock specific dependencies, " "their name can be listed in the command."}, - {opts, [ + {opts, [{all, $a, "all", undefined, "Unlock all dependencies and remove the lock file."}, {package, undefined, undefined, string, - "List of packages to unlock. If not specified, all dependencies are unlocked."} + "List of packages to unlock."} ]} ]) ), @@ -57,24 +57,41 @@ format_error({file, Reason}) -> io_lib:format("Lock file editing failed for reason ~p", [Reason]); format_error(unknown_lock_format) -> "Lock file format unknown"; +format_error(no_arg) -> + "Specify a list of dependencies to unlock, or --all to unlock them all"; format_error(Reason) -> io_lib:format("~p", [Reason]). handle_unlocks(State, Locks, LockFile) -> - {Args, _} = rebar_state:command_parsed_args(State), - Names = parse_names(rebar_utils:to_binary(proplists:get_value(package, Args, <<"">>))), - case [Lock || Lock = {Name, _, _} <- Locks, not lists:member(Name, Names)] of - [] -> + case handle_args(State) of + %% a list of dependencies or --all is required + {false, []} -> + throw(?PRV_ERROR(no_arg)); + %% if --all is specified, delete the lock file + {true, _} -> file:delete(LockFile), {ok, []}; - _ when Names =:= [] -> % implicitly all locks - file:delete(LockFile), - {ok, []}; - NewLocks -> - rebar_config:write_lock_file(LockFile, NewLocks), - {ok, NewLocks} + %% otherwise, unlock the given list of dependency names. if none are left, delete the lock file + {false, Names} -> + case [Lock || Lock = {Name, _, _} <- Locks, not lists:member(Name, Names)] of + [] -> + file:delete(LockFile), + {ok, []}; + _ when Names =:= [] -> % implicitly all locks + file:delete(LockFile), + {ok, []}; + NewLocks -> + rebar_config:write_lock_file(LockFile, NewLocks), + {ok, NewLocks} + end end. +handle_args(State) -> + {Args, _} = rebar_state:command_parsed_args(State), + All = proplists:get_value(all, Args, false), + Names = parse_names(rebar_utils:to_binary(proplists:get_value(package, Args, <<"">>))), + {All, Names}. + parse_names(Bin) -> case lists:usort(re:split(Bin, <<" *, *">>, [trim, unicode])) of [<<"">>] -> []; % nothing submitted diff --git a/src/rebar_prv_upgrade.erl b/src/rebar_prv_upgrade.erl index e1d6c60..63ad951 100644 --- a/src/rebar_prv_upgrade.erl +++ b/src/rebar_prv_upgrade.erl @@ -32,12 +32,12 @@ init(State) -> {deps, ?DEPS}, {example, "rebar3 upgrade [cowboy[,ranch]]"}, {short_desc, "Upgrade dependencies."}, - {desc, "Upgrade project dependencies. Mentioning no application " - "will upgrade all dependencies. To upgrade specific dependencies, " + {desc, "Upgrade project dependencies. Use the -a/--all option to " + "upgrade all dependencies. To upgrade specific dependencies, " "their names can be listed in the command."}, - {opts, [ + {opts, [{all, $a, "all", undefined, "Upgrade all dependencies."}, {package, undefined, undefined, string, - "List of packages to upgrade. If not specified, all dependencies are upgraded."} + "List of packages to upgrade."} ]}])), {ok, State1}. @@ -56,7 +56,6 @@ do(State) -> end. do_(State) -> - {Args, _} = rebar_state:command_parsed_args(State), Locks = rebar_state:get(State, {locks, default}, []), %% We have 3 sources of dependencies to upgrade from: %% 1. the top-level rebar.config (in `deps', dep name is an atom) @@ -81,8 +80,12 @@ do_(State) -> ProfileDeps = rebar_state:get(State, {deps, default}, []), Deps = [Dep || Dep <- TopDeps ++ ProfileDeps, % TopDeps > ProfileDeps is_atom(Dep) orelse is_atom(element(1, Dep))], - Names = parse_names(rebar_utils:to_binary(proplists:get_value(package, Args, <<"">>)), Locks), - + Names = case handle_args(State) of + {false, undefined} -> throw(?PRV_ERROR(no_arg)); + {true, _} -> [Name || {Name, _, 0} <- Locks]; + {false, Packages} -> Bin = rebar_utils:to_binary(Packages), + lists:usort(re:split(Bin, <<" *, *">>, [trim, unicode])) + end, DepsDict = deps_dict(rebar_state:all_deps(State)), AltDeps = find_non_default_deps(Deps, State), FilteredNames = cull_default_names_if_profiles(Names, Deps, State), @@ -127,9 +130,17 @@ format_error({transitive_dependency, Name}) -> format_error({checkout_dependency, Name}) -> io_lib:format("Dependency ~ts is a checkout dependency under _checkouts/ and checkouts cannot be upgraded.", [Name]); +format_error(no_arg) -> + "Specify a list of dependencies to upgrade, or --all to upgrade them all"; format_error(Reason) -> io_lib:format("~p", [Reason]). +handle_args(State) -> + {Args, _} = rebar_state:command_parsed_args(State), + All = proplists:get_value(all, Args, false), + Package = proplists:get_value(package, Args), + {All, Package}. + %% fetch updates for package deps that have been unlocked for upgrade update_pkg_deps([], _, _) -> ok; @@ -160,15 +171,6 @@ update_package(Name, RepoConfig, State) -> ok end. -parse_names(Bin, Locks) -> - case lists:usort(re:split(Bin, <<" *, *">>, [trim, unicode])) of - %% Nothing submitted, use *all* apps - [<<"">>] -> [Name || {Name, _, 0} <- Locks]; - [] -> [Name || {Name, _, 0} <- Locks]; - %% Regular options - Other -> Other - end. - %% Find alternative deps in non-default profiles since they may %% need to be passed through (they are never locked) find_non_default_deps(Deps, State) -> diff --git a/src/rebar_relx.erl b/src/rebar_relx.erl index 2216eb0..c457b22 100644 --- a/src/rebar_relx.erl +++ b/src/rebar_relx.erl @@ -118,6 +118,8 @@ format_error(all_relup) -> "Option --all can not be applied to `relup` command"; format_error({config_file, Filename, Error}) -> io_lib:format("Failed to read config file ~ts: ~p", [Filename, Error]); +format_error({release_not_found, Relname}) -> + io_lib:format("No releases exists in the system for ~s!", [Relname]); format_error(Error) -> io_lib:format("~p", [Error]). @@ -154,8 +156,9 @@ rel_handler({ok, _}, _) -> ok. releases_to_build(Provider, Opts, RelxState)-> - case proplists:get_value(all, Opts, undefined) of - undefined -> + case {proplists:get_value(all, Opts, undefined), + proplists:get_value(relnames, Opts, undefined)} of + {undefined, undefined} -> case proplists:get_value(relname, Opts, undefined) of undefined -> [undefined]; @@ -167,10 +170,20 @@ releases_to_build(Provider, Opts, RelxState)-> [{list_to_atom(R), RelVsn}] end end; - true when Provider =:= relup -> + {true, _} when Provider =:= relup -> erlang:error(?PRV_ERROR(all_relup)); - true -> - highest_unique_releases(rlx_state:configured_releases(RelxState)) + {true, _} -> + highest_unique_releases(rlx_state:configured_releases(RelxState)); + {_, Filter} -> + Releases = highest_unique_releases(rlx_state:configured_releases(RelxState)), + WantReleases = [list_to_atom(Rel) || Rel <- string:split(Filter, ",", all)], + [ + case proplists:lookup(Relname, Releases) of + none -> erlang:error(?PRV_ERROR({release_not_found, Relname})); + Rel -> Rel + end + || Relname <- WantReleases + ] end. %% takes a map of relx configured releases and returns a list of the highest @@ -249,9 +262,10 @@ app_info_to_relx(#{name := Name, vsn := Vsn, applications := Applications, included_applications := IncludedApplications, + optional_applications := OptionalApplications, dir := Dir, link := false}, AppType) -> - rlx_app_info:new(Name, Vsn, Dir, Applications, IncludedApplications, AppType). + rlx_app_info:new(Name, Vsn, Dir, Applications, IncludedApplications, OptionalApplications, AppType). -spec opt_spec_list() -> [getopt:option_spec()]. opt_spec_list() -> @@ -280,4 +294,5 @@ opt_spec_list() -> {sys_config, undefined, "sys_config", string, "Path to a file to use for sys.config"}, {system_libs, undefined, "system_libs", string, "Boolean or path to dir of Erlang system libs"}, {version, undefined, "version", undefined, "Print relx version"}, - {root_dir, $r, "root", string, "The project root directory"}]. + {root_dir, $r, "root", string, "The project root directory"}, + {relnames, $m, "relnames", string, "Like --all, but only build the releases in the list, e.g. --relnames rel1,rel2"}]. diff --git a/src/rebar_state.erl b/src/rebar_state.erl index b2234c7..a659797 100644 --- a/src/rebar_state.erl +++ b/src/rebar_state.erl @@ -481,8 +481,9 @@ add_provider(State=#state_t{providers=Providers, allow_provider_overrides=false} case lists:any(fun(P) -> case {providers:impl(P), providers:namespace(P)} of {Name, Namespace} -> - ?DEBUG("Not adding provider ~p ~p from module ~p because it already exists from module ~p", - [Namespace, Name, Module, providers:module(P)]), + ?DEBUG("Not adding provider ~ts ~ts from module ~ts because it already exists from module ~ts", + [atom_to_list(Namespace), atom_to_list(Name), + atom_to_list(Module), atom_to_list(providers:module(P))]), true; _ -> false diff --git a/src/rebar_templater.erl b/src/rebar_templater.erl index 001f6b1..50e7626 100644 --- a/src/rebar_templater.erl +++ b/src/rebar_templater.erl @@ -90,7 +90,7 @@ get_template_vars(TemplateTerms, State) -> %% Provide a way to merge a set of variables with another one. The left-hand %% set of variables takes precedence over the right-hand set. -%% In the case where left-hand variable description contains overriden defaults, but +%% In the case where left-hand variable description contains overridden defaults, but %% the right-hand one contains additional data such as documentation, the resulting %% variable description will contain the widest set of information possible. override_vars([], General) -> General; diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl index d5a6b4b..314f3a8 100644 --- a/src/rebar_utils.erl +++ b/src/rebar_utils.erl @@ -97,7 +97,7 @@ sort_deps(Deps) -> %% We need a sort stable, based on the name. So that for multiple deps on %% the same level with the same name, we keep the order the parents had. %% `lists:keysort/2' is documented as stable in the stdlib. - %% The list of deps is revered when we get it. For the proper stable + %% The list of deps is reversed when we get it. For the proper stable %% result, re-reverse it. lists:keysort(?APP_NAME_INDEX, lists:reverse(Deps)). @@ -129,7 +129,7 @@ is_arch(ArchRegex) -> false end. -%% @doc returns the sytem architecture, in strings like +%% @doc returns the system architecture, in strings like %% `"19.0.4-x86_64-unknown-linux-gnu-64"'. -spec get_arch() -> string(). get_arch() -> diff --git a/src/vendored/r3_hex_erl_tar.hrl b/src/vendored/r3_hex_erl_tar.hrl index 4ddfa53..e3f7bab 100644 --- a/src/vendored/r3_hex_erl_tar.hrl +++ b/src/vendored/r3_hex_erl_tar.hrl @@ -36,7 +36,7 @@ %% Options used when reading a tar archive. -record(read_opts, { cwd :: string(), %% Current working directory. - keep_old_files = false :: boolean(), %% Owerwrite or not. + keep_old_files = false :: boolean(), %% Overwrite or not. files = all, %% Set of files to extract (or all) output = file :: 'file' | 'memory', open_mode = [], %% Open mode options. @@ -202,7 +202,7 @@ %% These constants (except S_IFMT) are %% used to determine what type of device %% a file is. Namely, `S_IFMT band file_info.mode` -%% will equal one of these contants, and tells us +%% will equal one of these constants, and tells us %% which type it is. The stdlib file_info record %% does not differentiate between device types, and %% will not allow us to differentiate between sockets diff --git a/systest/all_SUITE_data/alias_clash/rebar.config b/systest/all_SUITE_data/alias_clash/rebar.config index baf20a9..9fc4c39 100644 --- a/systest/all_SUITE_data/alias_clash/rebar.config +++ b/systest/all_SUITE_data/alias_clash/rebar.config @@ -1,4 +1,4 @@ -{alias, [{help, [version]}, % should be skipped, but be overriden by plugin +{alias, [{help, [version]}, % should be skipped, but be overridden by plugin {test, [compile, {eunit, "-c"}, cover]}]}. {plugins, [rebar_alias]}. % should be overridden diff --git a/test/rebar_alias_SUITE.erl b/test/rebar_alias_SUITE.erl index d6e27d9..4356496 100644 --- a/test/rebar_alias_SUITE.erl +++ b/test/rebar_alias_SUITE.erl @@ -24,7 +24,7 @@ command(Config) -> Name = rebar_test_utils:create_random_name("alias_command_"), Vsn = rebar_test_utils:create_random_vsn(), rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), - RebarConfig = [{alias, [{test, [compile, unlock]}]}], + RebarConfig = [{alias, [{test, [compile, {unlock,"-a"}]}]}], %% compile job ran rebar_test_utils:run_and_check(Config, RebarConfig, @@ -64,7 +64,7 @@ many(Config) -> Vsn = rebar_test_utils:create_random_vsn(), rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), RebarConfig = [{alias, [{test, [{eunit,"-c"}, cover]}, - {nolock, [compile, unlock]}]}], + {nolock, [compile, {unlock,"-a"}]}]}], %% test job ran (compiled and succeeded) rebar_test_utils:run_and_check(Config, RebarConfig, diff --git a/test/rebar_compile_SUITE.erl b/test/rebar_compile_SUITE.erl index 8332384..57cfc62 100644 --- a/test/rebar_compile_SUITE.erl +++ b/test/rebar_compile_SUITE.erl @@ -40,6 +40,7 @@ all() -> include_file_relative_to_working_directory_test, include_file_in_src_test, include_file_in_src_test_multiapp, recompile_when_parse_transform_as_opt_changes, + dont_recompile_when_parse_transform_as_opt_unchanged, recompile_when_parse_transform_inline_changes, regex_filter_skip, regex_filter_regression, recursive, no_recursive, extra_recursion, @@ -2720,6 +2721,48 @@ recompile_when_parse_transform_as_opt_changes(Config) -> ?assert(ModTime =/= NewModTime). +dont_recompile_when_parse_transform_as_opt_unchanged(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("parse_transform_opt_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + ok = filelib:ensure_dir(filename:join([AppDir, "src", "dummy"])), + + ModSrc = <<"-module(example).\n" + "-export([foo/2]).\n" + "foo(_, _) -> ok.">>, + + ok = file:write_file(filename:join([AppDir, "src", "example.erl"]), + ModSrc), + + ParseTransform = <<"-module(example_parse_transform).\n" + "-export([parse_transform/2]).\n" + "parse_transform(AST, _) -> AST.">>, + + ok = file:write_file(filename:join([AppDir, "src", "example_parse_transform.erl"]), + ParseTransform), + + RebarConfig = [{erl_opts, [{parse_transform, example_parse_transform}]}], + + rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), + + EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), + {ok, Files} = rebar_utils:list_dir(EbinDir), + ModTime = [filelib:last_modified(filename:join([EbinDir, F])) + || F <- Files, filename:basename(F, ".beam") == "example"], + + timer:sleep(1000), + + rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), + + {ok, NewFiles} = rebar_utils:list_dir(EbinDir), + NewModTime = [filelib:last_modified(filename:join([EbinDir, F])) + || F <- NewFiles, filename:basename(F, ".beam") == "example"], + + ?assert(ModTime =:= NewModTime). + recursive(Config) -> AppDir = ?config(apps, Config), diff --git a/test/rebar_file_utils_SUITE.erl b/test/rebar_file_utils_SUITE.erl index 9b97bd4..2532a64 100644 --- a/test/rebar_file_utils_SUITE.erl +++ b/test/rebar_file_utils_SUITE.erl @@ -53,7 +53,7 @@ groups() -> mv_file_dir_same, mv_file_dir_diff, mv_no_clobber]}]. init_per_group(reset_dir, Config) -> - TmpDir = rebar_file_utils:system_tmpdir(["rebar_file_utils_SUITE", "resetable"]), + TmpDir = rebar_file_utils:system_tmpdir(["rebar_file_utils_SUITE", "resettable"]), [{tmpdir, TmpDir} | Config]; init_per_group(tmpdir, Config) -> PreviousTmpDir = os:getenv("TMPDIR"), diff --git a/test/rebar_pkg_alias_SUITE.erl b/test/rebar_pkg_alias_SUITE.erl index 1d31b2b..5ba544d 100644 --- a/test/rebar_pkg_alias_SUITE.erl +++ b/test/rebar_pkg_alias_SUITE.erl @@ -89,7 +89,7 @@ diff_alias(Config) -> {ok, [{Vsn, LockData}|_]} = file:consult(Lockfile), %% So does an upgrade rebar_test_utils:run_and_check( - Config, RebarConfig, ["upgrade"], + Config, RebarConfig, ["upgrade", "--all"], {ok, [{lock, "fakelib"},{dep, "fakelib"}]} ), {ok, [{Vsn, LockData}|_]} = file:consult(Lockfile). @@ -128,7 +128,7 @@ transitive_alias(Config) -> ?assertNot(filelib:is_dir(PkgName)), %% So does an upgrade rebar_test_utils:run_and_check( - Config, RebarConfig, ["upgrade"], + Config, RebarConfig, ["upgrade", "--all"], {ok, [{lock, "topdep"},{dep, "topdep"}, {lock,"transitive_app"},{dep,"transitive_app"}]} ), diff --git a/test/rebar_plugins_SUITE.erl b/test/rebar_plugins_SUITE.erl index 9167e08..087dfe5 100644 --- a/test/rebar_plugins_SUITE.erl +++ b/test/rebar_plugins_SUITE.erl @@ -12,6 +12,7 @@ list/1, upgrade/1, upgrade_project_plugin/1, + upgrade_no_args/1, sub_app_plugins/1, sub_app_plugin_overrides/1, project_plugins/1, @@ -191,7 +192,7 @@ upgrade(Config) -> {{iolist_to_binary(PkgName), <<"0.1.1">>}, []}]} ]), - %% beam file to verify plugin is acutally compiled + %% beam file to verify plugin is actually compiled PluginBeam = filename:join([AppDir, "_build", "default", "plugins", PkgName, "ebin", [PkgName, ".beam"]]), @@ -220,7 +221,7 @@ upgrade(Config) -> ), rebar_test_utils:run_and_check( - Config, RConf, ["plugins", "upgrade"], + Config, RConf, ["plugins", "upgrade", "--all"], {ok, [{app, Name, valid}, {file, PluginBeam}, {plugin, PkgName}]} ). @@ -263,6 +264,13 @@ upgrade_project_plugin(Config) -> {ok, [{app, Name}, {plugin, PkgName, <<"0.1.3">>}]} ). +upgrade_no_args(Config) -> + try rebar_test_utils:run_and_check(Config, [], ["plugins", "upgrade"], return) + catch {error, {rebar_prv_plugins_upgrade, no_arg}} -> + ok + end, + ok. + sub_app_plugins(Config) -> AppDir = ?config(apps, Config), diff --git a/test/rebar_release_SUITE.erl b/test/rebar_release_SUITE.erl index 5560a35..0844baf 100644 --- a/test/rebar_release_SUITE.erl +++ b/test/rebar_release_SUITE.erl @@ -49,7 +49,7 @@ release(Config) -> config_file(Config) -> AppDir = ?config(apps, Config), Name = list_to_atom(?config(name, Config)), - %% Relase build fails if no relx config exists + %% Release build fails if no relx config exists ?assertError({error, {relx, no_releases_in_system}}, rebar_test_utils:run_and_check(Config, [], ["release"], result)), %% Write relx.config diff --git a/test/rebar_unlock_SUITE.erl b/test/rebar_unlock_SUITE.erl index a8d1400..67692d2 100644 --- a/test/rebar_unlock_SUITE.erl +++ b/test/rebar_unlock_SUITE.erl @@ -3,7 +3,7 @@ -include_lib("eunit/include/eunit.hrl"). -compile(export_all). -all() -> [pkgunlock, unlock, unlock_all]. +all() -> [pkgunlock, unlock, unlock_all, unlock_no_args]. init_per_testcase(pkgunlock, Config0) -> Config = rebar_test_utils:init_rebar_state(Config0, "pkgunlock"), @@ -54,11 +54,18 @@ unlock(Config) -> unlock_all(Config) -> [_|_] = read_locks(Config), - {ok, State} = rebar_test_utils:run_and_check(Config, [], ["unlock"], return), + {ok, State} = rebar_test_utils:run_and_check(Config, [], ["unlock", "--all"], return), ?assertEqual({error, enoent}, read_locks(Config)), ?assertEqual([], rebar_state:get(State, {locks, default})), ok. +unlock_no_args(Config) -> + try rebar_test_utils:run_and_check(Config, [], ["unlock"], return) + catch {error, {rebar_prv_unlock, no_arg}} -> + ok + end, + ok. + read_locks(Config) -> case file:consult(?config(lockfile, Config)) of {ok, _} -> diff --git a/test/rebar_upgrade_SUITE.erl b/test/rebar_upgrade_SUITE.erl index 54ff18c..f56c4cf 100644 --- a/test/rebar_upgrade_SUITE.erl +++ b/test/rebar_upgrade_SUITE.erl @@ -3,7 +3,7 @@ -include_lib("eunit/include/eunit.hrl"). -compile(export_all). -all() -> [{group, git}, {group, pkg}, novsn_pkg]. +all() -> [{group, git}, {group, pkg}, novsn_pkg, upgrade_no_args]. groups() -> [{all, [], [top_a, top_b, top_c, top_d1, top_d2, top_e, @@ -53,6 +53,8 @@ init_per_testcase(novsn_pkg, Config0) -> end}, {expected, {ok, [{dep, "fakeapp", "1.1.0"}, {lock, "fakeapp", "1.1.0"}]}} | Config]; +init_per_testcase(upgrade_no_args, Config0) -> + rebar_test_utils:init_rebar_state(Config0, "upgrade_no_args_"); init_per_testcase(Case, Config) -> DepsType = ?config(deps_type, Config), {Deps, UpDeps, ToUp, Expectations} = upgrades(Case), @@ -543,6 +545,9 @@ mock_deps(pkg, OldDeps, Deps, Upgrades) -> {_, PkgDeps} = rebar_test_utils:flat_deps(Deps++OldDeps), mock_pkg_resource:mock([{pkgdeps, PkgDeps}, {upgrade, Upgrades}]). +normalize_unlocks({[], Locks}) -> + {"--all", + normalize_unlocks_expect(Locks)}; normalize_unlocks({App, Locks}) -> {iolist_to_binary(App), normalize_unlocks_expect(Locks)}; @@ -646,7 +651,7 @@ compile_upgrade_parity(Config) -> Lockfile = filename:join([AppDir, "rebar.lock"]), rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, []}), {ok, CompileLockData1} = file:read_file(Lockfile), - rebar_test_utils:run_and_check(Config, RebarConfig, ["upgrade"], {ok, []}), + rebar_test_utils:run_and_check(Config, RebarConfig, ["upgrade", "--all"], {ok, []}), {ok, UpgradeLockData} = file:read_file(Lockfile), rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, []}), {ok, CompileLockData2} = file:read_file(Lockfile), @@ -781,7 +786,7 @@ novsn_pkg(Config) -> Expectation = ?config(expected, Config), apply(?config(mock_update, Config), []), rebar_test_utils:run_and_check( - Config, RebarConfig, ["upgrade"], Expectation + Config, RebarConfig, ["upgrade", "--all"], Expectation ), ok. @@ -808,3 +813,10 @@ rewrite_locks({ok, Expectations}, Config) -> end, [], Locks), ct:pal("rewriting locks from ~p to~n~p", [Locks, NewLocks]), file:write_file(LockFile, io_lib:format("~p.~n", [NewLocks])). + +upgrade_no_args(Config) -> + try rebar_test_utils:run_and_check(Config, [], ["upgrade"], return) + catch {error, {rebar_prv_upgrade, no_arg}} -> + ok + end, + ok.