Hello community, here is the log from the commit of package elixir for openSUSE:Factory checked in at 2020-11-09 13:58:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/elixir (Old) and /work/SRC/openSUSE:Factory/.elixir.new.11331 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "elixir" Mon Nov 9 13:58:31 2020 rev:13 rq:847072 version:1.11.2 Changes: -------- --- /work/SRC/openSUSE:Factory/elixir/elixir.changes 2020-10-28 09:58:58.119169371 +0100 +++ /work/SRC/openSUSE:Factory/.elixir.new.11331/elixir.changes 2020-11-09 13:59:18.447715995 +0100 @@ -1,0 +2,14 @@ +Wed Nov 04 11:09:00 UTC 2020 - Sven Marquardt <dev@mail.smarquardt.space> + +- Elixir 1.11.2 + * Bug fixes + Elixir + [Code] Do not crash when getting docs for missing `erts` appdir + [Kernel] Raise meaningful error if `:erlang.is_record` is used in guards + [Kernel] Prune tracers when fetching `__ENV__` inside functions + + Mix + [mix] Fix regression where aliases could not call themselves recursively + [mix compile] Do not discard tracers that are set programatically + +------------------------------------------------------------------- @@ -605,0 +620 @@ +------------------------------------------------------------------- Old: ---- elixir-1.11.1.tar.gz New: ---- elixir-1.11.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ elixir-doc.spec ++++++ --- /var/tmp/diff_new_pack.SxTtgO/_old 2020-11-09 13:59:19.179714398 +0100 +++ /var/tmp/diff_new_pack.SxTtgO/_new 2020-11-09 13:59:19.183714390 +0100 @@ -17,7 +17,7 @@ Name: elixir-doc -Version: 1.11.1 +Version: 1.11.2 Release: 0 Summary: Documentation for elixir License: Apache-2.0 elixir.spec: same change ++++++ elixir-1.11.1.tar.gz -> elixir-1.11.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/CHANGELOG.md new/elixir-1.11.2/CHANGELOG.md --- old/elixir-1.11.1/CHANGELOG.md 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/CHANGELOG.md 2020-11-03 15:23:56.000000000 +0100 @@ -14,7 +14,7 @@ These two conditions may seem contradictory. After all, if a module is available, it must have come from a dependency. This is not true in two scenarios: - * Modules from Elixir and Erlang/OTP are always available - even if their applications are not explicitly listed as a dependency + * Modules from Elixir and Erlang/OTP are always available - even if their applications are not listed as a dependency * In an umbrella project, because all child applications are compiled within the same VM, you may have a module from a sibling project available, even if you don't depend on said sibling @@ -36,7 +36,7 @@ to your "def project" in mix.exs ``` -This comes with extra benefits in umbrella projects, as it requires child applications to explicitly list their dependencies, completely rejecting cyclic dependencies between siblings. +This comes with extra benefits in umbrella projects, as it requires applications to depend on the siblings they depend on, which will fail if there are any cyclic dependencies. ## Compiler checks: data constructors @@ -243,6 +243,21 @@ Mix also includes two new tasks: `mix app.config`, for application runtime configuration, and `mix test.coverage`, which generates aggregated coverage reports for umbrella projects and for test suites partitioned across processes. +## v1.11.2 (2020-11-03) + +### 1. Bug fixes + +#### Elixir + + * [Code] Do not crash when getting docs for missing `erts` appdir + * [Kernel] Raise meaningful error if `:erlang.is_record` is used in guards + * [Kernel] Prune tracers when fetching `__ENV__` inside functions + +#### Mix + + * [mix] Fix regression where aliases could not call themselves recursively + * [mix compile] Do not discard tracers that are set programatically + ## v1.11.1 (2020-10-16) ### 1. Bug fixes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/VERSION new/elixir-1.11.2/VERSION --- old/elixir-1.11.1/VERSION 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/VERSION 2020-11-03 15:23:56.000000000 +0100 @@ -1 +1 @@ -1.11.1 \ No newline at end of file +1.11.2 \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/elixir/lib/code.ex new/elixir-1.11.2/lib/elixir/lib/code.ex --- old/elixir-1.11.1/lib/elixir/lib/code.ex 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/elixir/lib/code.ex 2020-11-03 15:23:56.000000000 +0100 @@ -1373,8 +1373,16 @@ :error -> case :code.which(module) do :preloaded -> - path = Path.join([:code.lib_dir(:erts), "doc", "chunks", "#{module}.chunk"]) - fetch_docs_from_chunk(path) + # The erts directory is not necessarily included in releases + # unless it is listed as an extra application. + case :code.lib_dir(:erts) do + path when is_list(path) -> + path = Path.join([path, "doc", "chunks", "#{module}.chunk"]) + fetch_docs_from_chunk(path) + + {:error, _} -> + {:error, :chunk_not_found} + end _ -> {:error, :module_not_found} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/elixir/src/elixir_expand.erl new/elixir-1.11.2/lib/elixir/src/elixir_expand.erl --- old/elixir-1.11.1/lib/elixir/src/elixir_expand.erl 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/elixir/src/elixir_expand.erl 2020-11-03 15:23:56.000000000 +0100 @@ -469,7 +469,7 @@ escape_env_entries(Meta, #{current_vars := {Read, Write}, unused_vars := {Unused, Version}} = Env0) -> Env1 = case Env0 of #{function := nil} -> Env0; - _ -> Env0#{lexical_tracker := nil} + _ -> Env0#{lexical_tracker := nil, tracers := []} end, Current = {maybe_escape_map(Read), maybe_escape_map(Write)}, Env2 = Env1#{current_vars := Current, unused_vars := {maybe_escape_map(Unused), Version}}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/elixir/src/elixir_rewrite.erl new/elixir-1.11.2/lib/elixir/src/elixir_rewrite.erl --- old/elixir-1.11.1/lib/elixir/src/elixir_rewrite.erl 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/elixir/src/elixir_rewrite.erl 2020-11-03 15:23:56.000000000 +0100 @@ -327,6 +327,10 @@ _ -> {error, {invalid_guard, Receiver, Right, length(Args)}} end. +%% erlang:is_record/2-3 are compiler guards in Erlang which we +%% need to explicitly forbid as they are allowed in erl_internal. +allowed_guard(is_record, 2) -> false; +allowed_guard(is_record, 3) -> false; allowed_guard(Right, Arity) -> erl_internal:guard_bif(Right, Arity) orelse elixir_utils:guard_op(Right, Arity). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/elixir/test/elixir/kernel/expansion_test.exs new/elixir-1.11.2/lib/elixir/test/elixir/kernel/expansion_test.exs --- old/elixir-1.11.1/lib/elixir/test/elixir/kernel/expansion_test.exs 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/elixir/test/elixir/kernel/expansion_test.exs 2020-11-03 15:23:56.000000000 +0100 @@ -294,6 +294,7 @@ test "__ENV__" do env = %{__ENV__ | line: 0} assert expand_env(quote(do: __ENV__), env) == {Macro.escape(env), env} + assert %{lexical_tracker: nil, tracers: []} = __ENV__ end test "__ENV__.accessor" do @@ -302,6 +303,9 @@ assert expand_env(quote(do: __ENV__.unknown), env) == {quote(do: unquote(Macro.escape(env)).unknown), env} + + assert __ENV__.lexical_tracker == nil + assert __ENV__.tracers == [] end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/elixir/test/elixir/kernel/guard_test.exs new/elixir-1.11.2/lib/elixir/test/elixir/kernel/guard_test.exs --- old/elixir-1.11.1/lib/elixir/test/elixir/kernel/guard_test.exs 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/elixir/test/elixir/kernel/guard_test.exs 2020-11-03 15:23:56.000000000 +0100 @@ -311,6 +311,22 @@ end assert_raise CompileError, + ~r"cannot invoke remote function :erlang\.is_record/2 inside guards", + fn -> + defmodule IsRecord2Usage do + defguard foo(rec) when :erlang.is_record(rec, :tag) + end + end + + assert_raise CompileError, + ~r"cannot invoke remote function :erlang\.is_record/3 inside guards", + fn -> + defmodule IsRecord3Usage do + defguard foo(rec) when :erlang.is_record(rec, :tag, 7) + end + end + + assert_raise CompileError, ~r"cannot invoke remote function :erlang\.\+\+/2 inside guards", fn -> defmodule ListSubtractionUsage do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/elixir/test/elixir/module/types/integration_test.exs new/elixir-1.11.2/lib/elixir/test/elixir/module/types/integration_test.exs --- old/elixir-1.11.1/lib/elixir/test/elixir/module/types/integration_test.exs 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/elixir/test/elixir/module/types/integration_test.exs 2020-11-03 15:23:56.000000000 +0100 @@ -1,4 +1,4 @@ -Code.require_file("../../test_helper.exs", __DIR__) +Code.require_file("type_helper.exs", __DIR__) defmodule Module.Types.IntegrationTest do use ExUnit.Case diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/elixir/test/elixir/module/types/pattern_test.exs new/elixir-1.11.2/lib/elixir/test/elixir/module/types/pattern_test.exs --- old/elixir-1.11.1/lib/elixir/test/elixir/module/types/pattern_test.exs 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/elixir/test/elixir/module/types/pattern_test.exs 2020-11-03 15:23:56.000000000 +0100 @@ -1,4 +1,4 @@ -Code.require_file("../../test_helper.exs", __DIR__) +Code.require_file("type_helper.exs", __DIR__) defmodule Module.Types.PatternTest do use ExUnit.Case, async: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/elixir/test/elixir/module/types/types_test.exs new/elixir-1.11.2/lib/elixir/test/elixir/module/types/types_test.exs --- old/elixir-1.11.1/lib/elixir/test/elixir/module/types/types_test.exs 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/elixir/test/elixir/module/types/types_test.exs 2020-11-03 15:23:56.000000000 +0100 @@ -1,4 +1,4 @@ -Code.require_file("../../test_helper.exs", __DIR__) +Code.require_file("type_helper.exs", __DIR__) defmodule Module.Types.TypesTest do use ExUnit.Case, async: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/elixir/test/elixir/module/types/unify_test.exs new/elixir-1.11.2/lib/elixir/test/elixir/module/types/unify_test.exs --- old/elixir-1.11.1/lib/elixir/test/elixir/module/types/unify_test.exs 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/elixir/test/elixir/module/types/unify_test.exs 2020-11-03 15:23:56.000000000 +0100 @@ -1,4 +1,4 @@ -Code.require_file("../../test_helper.exs", __DIR__) +Code.require_file("type_helper.exs", __DIR__) defmodule Module.Types.UnifyTest do use ExUnit.Case, async: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/mix/lib/mix/compilers/application_tracer.ex new/elixir-1.11.2/lib/mix/lib/mix/compilers/application_tracer.ex --- old/elixir-1.11.1/lib/mix/lib/mix/compilers/application_tracer.ex 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/mix/lib/mix/compilers/application_tracer.ex 2020-11-03 15:23:56.000000000 +0100 @@ -25,6 +25,12 @@ :ok end + # Also skip __impl__ calls inside protocols as they are meant + # to invert dependencies. + def trace({_, _, _, :__impl__, _}, _env) do + :ok + end + def trace({type, meta, module, function, arity}, env) when type in [:remote_function, :remote_macro, :imported_function, :imported_macro] do # Unknown modules need to be looked up and filtered later diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/mix/lib/mix/task.ex new/elixir-1.11.2/lib/mix/lib/mix/task.ex --- old/elixir-1.11.1/lib/mix/lib/mix/task.ex 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/mix/lib/mix/task.ex 2020-11-03 15:23:56.000000000 +0100 @@ -355,12 +355,12 @@ alias = Mix.Project.config()[:aliases][String.to_atom(task)] cond do - is_nil(alias) -> - run_task(proj, task, args) - - Mix.TasksServer.run({:alias, task, proj}) -> + alias && Mix.TasksServer.run({:alias, task, proj}) -> run_alias(List.wrap(alias), args, proj, task, :ok) + !Mix.TasksServer.get({:task, task, proj}) -> + run_task(proj, task, args) + true -> :noop end @@ -371,8 +371,8 @@ # 2. Otherwise we compile and load dependencies # 3. Finally, we compile the current project in hope it is available. module = - get_task_or_run(proj, task, fn -> Mix.Task.run("deps.loadpaths") end) || - get_task_or_run(proj, task, fn -> Mix.Task.run("compile", []) end) || + get_task_or_run(proj, task, fn -> run("deps.loadpaths") end) || + get_task_or_run(proj, task, fn -> run("compile", []) end) || get!(task) recursive = recursive(module) @@ -450,7 +450,8 @@ run_alias(t, alias_args, proj, original_task, res) end - defp run_alias([], _alias_task, _proj, _original_task, res) do + defp run_alias([], _alias_args, proj, original_task, res) do + Mix.TasksServer.put({:task, original_task, proj}) res end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/mix/lib/mix/tasks/compile.elixir.ex new/elixir-1.11.2/lib/mix/lib/mix/tasks/compile.elixir.ex --- old/elixir-1.11.1/lib/mix/lib/mix/tasks/compile.elixir.ex 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/mix/lib/mix/tasks/compile.elixir.ex 2020-11-03 15:23:56.000000000 +0100 @@ -103,12 +103,13 @@ manifest = manifest() configs = [Mix.Project.config_mtime() | Mix.Tasks.Compile.Erlang.manifests()] force = opts[:force] || Mix.Utils.stale?(configs, [manifest]) + {tracers, opts} = pop_tracers(opts) opts = (project[:elixirc_options] || []) |> Keyword.merge(opts) |> xref_exclude_opts(project) - |> tracers_opts() + |> tracers_opts(tracers) |> profile_opts() Mix.Compilers.Elixir.compile(manifest, srcs, dest, [:ex], force, opts) @@ -134,17 +135,21 @@ end end - defp tracers_opts(opts) do + defp pop_tracers(opts) do case Keyword.pop_values(opts, :tracer) do {[], opts} -> - opts + {[], opts} {tracers, opts} -> - tracers = Enum.map(tracers, &Module.concat([&1])) - Keyword.update(opts, :tracers, tracers, &(tracers ++ &1)) + {Enum.map(tracers, &Module.concat([&1])), opts} end end + defp tracers_opts(opts, tracers) do + tracers = tracers ++ Code.get_compiler_option(:tracers) + Keyword.update(opts, :tracers, tracers, &(tracers ++ &1)) + end + defp profile_opts(opts) do case Keyword.fetch(opts, :profile) do {:ok, "time"} -> Keyword.put(opts, :profile, :time) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/mix/lib/mix/tasks_server.ex new/elixir-1.11.2/lib/mix/lib/mix/tasks_server.ex --- old/elixir-1.11.1/lib/mix/lib/mix/tasks_server.ex 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/mix/lib/mix/tasks_server.ex 2020-11-03 15:23:56.000000000 +0100 @@ -21,6 +21,10 @@ Agent.update(@name, &Map.put(&1, tuple, true), @timeout) end + def get(tuple) do + Agent.get(@name, &Map.get(&1, tuple), @timeout) + end + def delete_many(many) do Agent.update(@name, &Map.drop(&1, many), @timeout) end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/mix/test/mix/aliases_test.exs new/elixir-1.11.2/lib/mix/test/mix/aliases_test.exs --- old/elixir-1.11.1/lib/mix/test/mix/aliases_test.exs 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/mix/test/mix/aliases_test.exs 2020-11-03 15:23:56.000000000 +0100 @@ -10,11 +10,14 @@ h: "hello", p: &inspect/1, compile: "hello", + cmd: &call_cmd/1, help: ["help", "hello"], "nested.h": [&Mix.shell().info(inspect(&1)), "h foo bar"] ] ] end + + defp call_cmd(args), do: Mix.Task.run("cmd", args) end setup do @@ -50,13 +53,18 @@ assert Mix.Task.run("compile", []) == :noop end - test "run alias override with recursion" do + test "run alias override with name-recursion" do assert Mix.Task.rerun("help", []) == "Hello, World!" assert_received {:mix_shell, :info, ["mix test" <> _]} # Arguments are passed to the recursive task and not the last one. assert ExUnit.CaptureIO.capture_io(fn -> - Mix.Task.rerun("help", ["test"]) == "Hello, World!" + Mix.Task.rerun("help", ["test"]) end) =~ "mix test" end + + test "run alias override with code-recursion" do + assert Mix.Task.rerun("cmd", ["echo", "hello"]) == :ok + assert_received {:mix_shell, :run, ["hello" <> _]} + end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.11.1/lib/mix/test/mix/tasks/compile.elixir_test.exs new/elixir-1.11.2/lib/mix/test/mix/tasks/compile.elixir_test.exs --- old/elixir-1.11.1/lib/mix/test/mix/tasks/compile.elixir_test.exs 2020-10-16 09:31:35.000000000 +0200 +++ new/elixir-1.11.2/lib/mix/test/mix/tasks/compile.elixir_test.exs 2020-11-03 15:23:56.000000000 +0100 @@ -57,6 +57,19 @@ Code.put_compiler_option(:tracers, []) end + test "compiles a project with a previously set custom tracer" do + Process.register(self(), __MODULE__) + Code.put_compiler_option(:tracers, [__MODULE__]) + + in_fixture("no_mixfile", fn -> + Mix.Tasks.Compile.Elixir.run([]) + assert_received {:alias_reference, _meta, A} + assert_received {:alias_reference, _meta, B} + end) + after + Code.put_compiler_option(:tracers, []) + end + test "warns when Logger is used but not depended on" do in_fixture("no_mixfile", fn -> File.write!("lib/a.ex", """