Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package elixir for openSUSE:Factory checked in at 2025-10-22 12:14:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/elixir (Old) and /work/SRC/openSUSE:Factory/.elixir.new.18484 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "elixir" Wed Oct 22 12:14:54 2025 rev:42 rq:1312705 version:1.19.1 Changes: -------- --- /work/SRC/openSUSE:Factory/elixir/elixir.changes 2025-10-17 17:29:59.564632651 +0200 +++ /work/SRC/openSUSE:Factory/.elixir.new.18484/elixir.changes 2025-10-22 12:19:02.114423486 +0200 @@ -1,0 +2,6 @@ +Tue Oct 21 07:38:25 UTC 2025 - Alessio Biancalana <[email protected]> + +- Upgrade to Elixir 1.19.1 + * Changelog available at https://hexdocs.pm/elixir/1.19.1/changelog.html + +------------------------------------------------------------------- Old: ---- elixir-1.19.0-doc.zip elixir-1.19.0.tar.gz New: ---- elixir-1.19.1-doc.zip elixir-1.19.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ elixir.spec ++++++ --- /var/tmp/diff_new_pack.XjTyWC/_old 2025-10-22 12:19:03.262471846 +0200 +++ /var/tmp/diff_new_pack.XjTyWC/_new 2025-10-22 12:19:03.262471846 +0200 @@ -18,7 +18,7 @@ %define elixirdir %{_prefix}/lib/elixir Name: elixir -Version: 1.19.0 +Version: 1.19.1 Release: 0 Summary: Functional meta-programming aware language built atop Erlang License: Apache-2.0 ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.XjTyWC/_old 2025-10-22 12:19:03.322474374 +0200 +++ /var/tmp/diff_new_pack.XjTyWC/_new 2025-10-22 12:19:03.326474542 +0200 @@ -1,6 +1,6 @@ -mtime: 1760703252 -commit: f4e0b57780a24f098f87043566389356a23cd330f836c3b882be8e5b9e202674 +mtime: 1761032378 +commit: 4b9d7e240c8ecc353eaf3e1706eb74f10124c390b153cdd6960fc0483f71d173 url: https://src.opensuse.org/erlang/elixir.git -revision: f4e0b57780a24f098f87043566389356a23cd330f836c3b882be8e5b9e202674 +revision: 4b9d7e240c8ecc353eaf3e1706eb74f10124c390b153cdd6960fc0483f71d173 projectscmsync: https://src.opensuse.org/erlang/_ObsPrj.git ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2025-10-21 09:43:07.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ elixir-1.19.0-doc.zip -> elixir-1.19.1-doc.zip ++++++ ++++ 72495 lines of diff (skipped) ++++++ elixir-1.19.0.tar.gz -> elixir-1.19.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/.github/workflows/release.yml new/elixir-1.19.1/.github/workflows/release.yml --- old/elixir-1.19.0/.github/workflows/release.yml 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/.github/workflows/release.yml 2025-10-20 17:30:38.000000000 +0200 @@ -309,7 +309,6 @@ AWS_SECRET_ACCESS_KEY: ${{ secrets.HEX_AWS_SECRET_ACCESS_KEY }} AWS_REGION: ${{ vars.HEX_AWS_REGION }} AWS_S3_BUCKET: ${{ vars.HEX_AWS_S3_BUCKET }} - OTP_GENERIC_VERSION: "25" steps: - name: "Check if variables are set up" if: "${{ ! vars.HEX_AWS_REGION }}" @@ -330,6 +329,8 @@ run: | ref_name=${{ github.ref_name }} + oldest_otp=$(find . -type f -name 'elixir-otp-*.zip' | sed -r 's/^.*elixir-otp-([[:digit:]]+)\.zip$/\1/' | sort -n | head -n 1) + for zip in $(find . -type f -name 'elixir-otp-*.zip' | sed 's/^\.\///'); do dest=${zip/elixir/${ref_name}} surrogate_key=${dest/.zip$/} @@ -339,7 +340,7 @@ --metadata "{\"surrogate-key\":\"builds builds/elixir builds/elixir/${surrogate_key}\",\"surrogate-control\":\"public,max-age=604800\"}" echo "builds/elixir/${surrogate_key}" >> purge_keys.txt - if [ "$zip" == "elixir-otp-${OTP_GENERIC_VERSION}.zip" ]; then + if [ "$zip" == "elixir-otp-${oldest_otp}.zip" ]; then aws s3 cp "${zip}" "s3://${AWS_S3_BUCKET}/builds/elixir/${ref_name}.zip" \ --cache-control "public,max-age=3600" \ --metadata "{\"surrogate-key\":\"builds builds/elixir builds/elixir/${ref_name}\",\"surrogate-control\":\"public,max-age=604800\"}" @@ -372,6 +373,8 @@ date="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" ref_name=${{ github.ref_name }} + oldest_otp=$(find . -name 'elixir-otp-*.zip.sha256sum' | sed -r 's/^.*elixir-otp-([[:digit:]]+)\.zip\.sha256sum$/\1/' | sort -n | head -n 1) + aws s3 cp "s3://${AWS_S3_BUCKET}/builds/elixir/builds.txt" builds.txt || true touch builds.txt @@ -382,7 +385,7 @@ sed -i "/^${ref_name}-${otp_version} /d" builds.txt echo -e "${ref_name}-${otp_version} ${{ github.sha }} ${date} ${build_sha256} \n$(cat builds.txt)" > builds.txt - if [ "${otp_version}" == "otp-${OTP_GENERIC_VERSION}" ]; then + if [ "${otp_version}" == "otp-${oldest_otp}" ]; then sed -i "/^${ref_name} /d" builds.txt echo -e "${ref_name} ${{ github.sha }} ${date} ${build_sha256} \n$(cat builds.txt)" > builds.txt fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/CHANGELOG.md new/elixir-1.19.1/CHANGELOG.md --- old/elixir-1.19.0/CHANGELOG.md 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/CHANGELOG.md 2025-10-20 17:30:38.000000000 +0200 @@ -234,6 +234,26 @@ This work was performed by [Jonatan Männchen](https://maennchen.dev) and sponsored by the [Erlang Ecosystem Foundation](https://erlef.org). +## v1.19.1 (2025-10-20) + +### 1. Bug fixes + +#### EEx + + * [EEx] Address Dialyzer warnings when invoking `EEx.compile_string` + +#### Elixir + + * [Kernel] Optimize how types are computed for pretty printing + * [Kernel] Optimize how differences are computed in the type system + * [Macro] Do not escape options given to `dbg/2` + * [Protocol] Improve protocol violation warnings + +#### Mix + + * [mix compile] Do not attempt to touch deleted files when compilation fails and then resumed with missing files + * [mix deps.compile] Do not spawn partitions when all dependencies are local and already compiled + ## v1.19.0 (2025-10-16) ### 1. Enhancements diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/VERSION new/elixir-1.19.1/VERSION --- old/elixir-1.19.0/VERSION 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/VERSION 2025-10-20 17:30:38.000000000 +0200 @@ -1 +1 @@ -1.19.0 +1.19.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/bin/elixir new/elixir-1.19.1/bin/elixir --- old/elixir-1.19.0/bin/elixir 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/bin/elixir 2025-10-20 17:30:38.000000000 +0200 @@ -6,7 +6,7 @@ set -e -ELIXIR_VERSION=1.19.0 +ELIXIR_VERSION=1.19.1 if [ $# -eq 0 ] || { [ $# -eq 1 ] && { [ "$1" = "--help" ] || [ "$1" = "-h" ]; }; }; then cat <<USAGE >&2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/bin/elixir.bat new/elixir-1.19.1/bin/elixir.bat --- old/elixir-1.19.0/bin/elixir.bat 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/bin/elixir.bat 2025-10-20 17:30:38.000000000 +0200 @@ -4,7 +4,7 @@ :: SPDX-FileCopyrightText: 2021 The Elixir Team :: SPDX-FileCopyrightText: 2012 Plataformatec -set ELIXIR_VERSION=1.19.0 +set ELIXIR_VERSION=1.19.1 if ""%1""=="""" if ""%2""=="""" goto documentation if /I ""%1""==""--help"" if ""%2""=="""" goto documentation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/eex/lib/eex.ex new/elixir-1.19.1/lib/eex/lib/eex.ex --- old/elixir-1.19.0/lib/eex/lib/eex.ex 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/eex/lib/eex.ex 2025-10-20 17:30:38.000000000 +0200 @@ -236,7 +236,9 @@ """ @spec compile_string(String.t(), [compile_opt]) :: Macro.t() def compile_string(source, options \\ []) when is_binary(source) and is_list(options) do - case tokenize(source, options) do + tokenize_opts = Keyword.take(options, [:file, :line, :column, :indentation, :trim]) + + case tokenize(source, tokenize_opts) do {:ok, tokens} -> EEx.Compiler.compile(tokens, source, options) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/elixir/lib/macro.ex new/elixir-1.19.1/lib/elixir/lib/macro.ex --- old/elixir-1.19.0/lib/elixir/lib/macro.ex 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/elixir/lib/macro.ex 2025-10-20 17:30:38.000000000 +0200 @@ -2700,7 +2700,7 @@ :ok end - prelude = quote do: options = unquote(Macro.escape(options)) + prelude = quote do: options = unquote(options) acc = {prelude, dbg_format_header(env)} {acc, nil} = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/elixir/lib/module/types/apply.ex new/elixir-1.19.1/lib/elixir/lib/module/types/apply.ex --- old/elixir-1.19.0/lib/elixir/lib/module/types/apply.ex 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/elixir/lib/module/types/apply.ex 2025-10-20 17:30:38.000000000 +0200 @@ -979,7 +979,7 @@ {mod, fun, arity, converter} = mfac meta = elem(expr, 1) - {banner, hints, traces} = + {banner, traces} = case Keyword.get(meta, :type_check) do :interpolation -> {_, _, [arg]} = expr @@ -990,7 +990,7 @@ #{expr_to_string(arg) |> indent(4)} it has type: - """, [:interpolation], collect_traces(expr, context)} + """, collect_traces(expr, context)} :generator -> {:<-, _, [_, arg]} = expr @@ -1001,7 +1001,7 @@ #{expr_to_string(expr) |> indent(4)} it has type: - """, [:generator], collect_traces(arg, context)} + """, collect_traces(arg, context)} :into -> {""" @@ -1010,7 +1010,7 @@ into: #{expr_to_string(expr) |> indent(4)} it has type: - """, [:into], collect_traces(expr, context)} + """, collect_traces(expr, context)} _ -> mfa_or_fa = if mod, do: Exception.format_mfa(mod, fun, arity), else: "#{fun}/#{arity}" @@ -1021,37 +1021,68 @@ #{expr_to_string(expr) |> indent(4)} given types: - """, [], collect_traces(expr, context)} + """, collect_traces(expr, context)} end - explanation = + {explanation, impls} = cond do reason = empty_arg_reason(converter.(args_types)) -> - reason + {reason, ""} Code.ensure_loaded?(mod) and Keyword.has_key?(mod.module_info(:attributes), :__protocol__) -> if function_exported?(mod, :__protocol__, 1) and mod.__protocol__(:impls) == {:consolidated, []} do - """ - but the protocol was not yet implemented for any type and therefore will always fail. \ - This error typically happens within libraries that define protocols and will disappear as \ - soon as there is one implementation. If you expect the protocol to be implemented later on, \ - you can define an implementation specific for development/test. - """ + {""" + but the #{inspect(mod)} protocol was not yet implemented \ + for any type and therefore will always fail. + + This warning will disappear once you define a implementation. \ + If the protocol is part of a library, you may define a dummy \ + implementation for development/test. + """, ""} else - # Protocol errors can be very verbose, so we collapse structs - """ - but expected a type that implements the #{inspect(mod)} protocol, it must be one of: - #{clauses_args_to_quoted_string(clauses, converter, collapse_structs: true)} - """ + fix = + case mod do + String.Chars -> + """ + You either passed the wrong value or you must: + + 1. convert the given value to a string explicitly + (use inspect/1 if you want to convert any data structure to a string) + 2. implement the String.Chars protocol + """ + + Enumerable -> + """ + You either passed the wrong value or you must: + + 1. convert the given value to an Enumerable explicitly + 2. implement the Enumerable protocol + """ + + _ -> + """ + You either passed the wrong value or you forgot to implement the protocol. + """ + end + + {""" + but expected a type that implements the #{inspect(mod)} protocol. + #{fix}\ + """, + """ + + #{hint()} the #{inspect(mod)} protocol is implemented for the following types: + #{clauses_args_to_quoted_string(clauses, converter, collapse_structs: true)} + """} end true -> - """ - but expected one of: - #{clauses_args_to_quoted_string(clauses, converter, [])} - """ + {""" + but expected one of: + #{clauses_args_to_quoted_string(clauses, converter, [])} + """, ""} end %{ @@ -1066,7 +1097,7 @@ """, explanation, format_traces(traces), - format_hints(hints) + impls ]) } end @@ -1252,7 +1283,7 @@ common = intersection(actual, expected) uncommon_doc = - difference(actual, common) + difference(actual, expected) |> to_quoted() |> Code.Formatter.to_algebra() |> ansi_red() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/elixir/lib/module/types/descr.ex new/elixir-1.19.1/lib/elixir/lib/module/types/descr.ex --- old/elixir-1.19.0/lib/elixir/lib/module/types/descr.ex 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/elixir/lib/module/types/descr.ex 2025-10-20 17:30:38.000000000 +0200 @@ -4495,19 +4495,58 @@ _ -> case bdd_compare(bdd1, bdd2) do {:lt, {lit1, c1, u1, d1}, bdd2} -> - {lit1, bdd_difference(bdd_union(c1, u1), bdd2), :bdd_bot, - bdd_difference(bdd_union(d1, u1), bdd2)} + {lit1, bdd_difference(c1, bdd2), bdd_difference(u1, bdd2), bdd_difference(d1, bdd2)} {:gt, bdd1, {lit2, c2, u2, d2}} -> - {lit2, bdd_difference(bdd1, bdd_union(c2, u2)), :bdd_bot, - bdd_difference(bdd1, bdd_union(d2, u2))} + # The proper formula is: + # + # b1 and not (c2 or u2) : bdd_bot : b1 and not (d2 or u2) + # + # Both extremes have (b1 and not u2), + # so we compute it first and only once. + bdd1_minus_u2 = bdd_difference(bdd1, u2) + {lit2, bdd_difference(bdd1_minus_u2, c2), :bdd_bot, bdd_difference(bdd1_minus_u2, d2)} {:eq, {lit, c1, u1, d1}, {_, c2, u2, d2}} -> cond do - u2 == :bdd_bot and d2 == :bdd_bot -> - {lit, bdd_difference(c1, c2), bdd_difference(u1, c2), bdd_union(u1, d1)} + c2 == :bdd_bot and d2 == :bdd_bot -> + {lit, bdd_difference(c1, u2), bdd_difference(u1, u2), bdd_difference(d1, u2)} - u1 == u2 -> + u2 == :bdd_bot -> + cond do + d2 == :bdd_bot -> + {lit, bdd_difference(c1, c2), bdd_difference(u1, c2), bdd_union(u1, d1)} + + c2 == :bdd_bot -> + {lit, bdd_union(u1, c1), bdd_difference(u1, d2), bdd_difference(c1, c2)} + + true -> + # If d2 or c2 are bottom, we can remove one union. + # + # For example, if d2 is bottom, we have this BDD: + # + # {l, (C1 or U1) and not C2, U1 and not C2, D1 or U1} + # + # Where the constrained part is: + # + # (l and (C1 or U1) and not C2) + # + # Which expands to: + # + # (l and C1 and not C2) or (l and U1 and not C2) + # + # Given (U1 and not C2) is already part of the uncertain/union, + # we can skip (l and U1 and not C2), and we end up with: + # + # {l, C1 and not C2, U1 and not C2, D1 or U1} + # + # Which are the formulas used above. + {lit, bdd_difference(bdd_union(u1, c1), c2), + bdd_difference(bdd_difference(u1, c2), d2), + bdd_difference(bdd_union(u1, d1), d2)} + end + + u1 == :bdd_bot or u1 == u2 -> {lit, bdd_difference_union(c1, c2, u2), :bdd_bot, bdd_difference_union(d1, d2, u2)} @@ -4568,15 +4607,20 @@ bdd_intersection(bdd1, d2)} # Notice that (l ? c1, u1, d1) and (l ? c2, u2, d2) is, on paper, equivalent to - # [(l /\ c1) \/ u1 \/ (not l /\ d1)] and [(l /\ c2) \/ u2 \/ (not l /\ d2)] + # [(l and c1) or u1 or (not l and d1)] and [(l and c2) or u2 or (not l and d2)]. + # # which is equivalent, by distributivity of intersection over union, to - # l /\ [(c1 /\ c2) \/ (c1 /\ u2) \/ (u1 /\ c2)] - # \/ (u1 /\ u2) - # \/ [(not l) /\ ((d1 /\ u2) \/ (d1 /\ d2) \/ (u1 /\ d2))] + # + # l and [(c1 and c2) or (c1 and u2) or (u1 and c2)] + # or (u1 and u2) + # or [(not l) and ((d1 and u2) or (d1 and d2) or (u1 and d2))] + # # which is equivalent, by factoring out c1 in the first disjunct, and d1 in the third, to - # l /\ [c1 /\ (c2 \/ u2)] \/ (u1 /\ c2) - # \/ (u1 /\ u2) - # \/ (not l) /\ [d1 /\ (u2 \/ d2) \/ (u1 /\ d2)] + # + # l and [c1 and (c2 or u2)] or (u1 and c2) + # or (u1 and u2) + # or (not l) and [d1 and (u2 or d2) or (u1 and d2)] + # # This last expression gives the following implementation: {:eq, {lit, c1, u1, d1}, {_, c2, u2, d2}} -> {lit, bdd_union(bdd_intersection_union(c1, c2, u2), bdd_intersection(u1, c2)), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/elixir/lib/module/types/helpers.ex new/elixir-1.19.1/lib/elixir/lib/module/types/helpers.ex --- old/elixir-1.19.0/lib/elixir/lib/module/types/helpers.ex 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/elixir/lib/module/types/helpers.ex 2025-10-20 17:30:38.000000000 +0200 @@ -91,29 +91,6 @@ "var.fun()" (with parentheses) means "var" is an atom() """ - :interpolation -> - """ - - #{hint()} string interpolation uses the String.Chars protocol to \ - convert a data structure into a string. Either convert the data type into a \ - string upfront or implement the protocol accordingly - """ - - :generator -> - """ - - #{hint()} for-comprehensions use the Enumerable protocol to traverse \ - data structures. Either convert the data type into a list (or another Enumerable) \ - or implement the protocol accordingly - """ - - :into -> - """ - - #{hint()} the :into option in for-comprehensions use the Collectable protocol to \ - build its result. Either pass a valid data type or implement the protocol accordingly - """ - :anonymous_rescue -> """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/elixir/test/elixir/kernel_test.exs new/elixir-1.19.1/lib/elixir/test/elixir/kernel_test.exs --- old/elixir-1.19.0/lib/elixir/test/elixir/kernel_test.exs 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/elixir/test/elixir/kernel_test.exs 2025-10-20 17:30:38.000000000 +0200 @@ -1484,6 +1484,11 @@ assert output =~ "3" end + test "prints the given expression with complex options" do + output = capture_io(fn -> assert dbg(123, [] ++ []) == 123 end) + assert output =~ "kernel_test.exs" + end + test "doesn't print any colors if :syntax_colors is []" do output = capture_io(fn -> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/elixir/test/elixir/module/types/integration_test.exs new/elixir-1.19.1/lib/elixir/test/elixir/module/types/integration_test.exs --- old/elixir-1.19.0/lib/elixir/test/elixir/module/types/integration_test.exs 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/elixir/test/elixir/module/types/integration_test.exs 2025-10-20 17:30:38.000000000 +0200 @@ -449,10 +449,9 @@ -:hello- - but the protocol was not yet implemented for any type and therefore will always fail. \ - This error typically happens within libraries that define protocols and will disappear as \ - soon as there is one implementation. If you expect the protocol to be implemented later on, \ - you can define an implementation specific for development/test. + but the NoImplProtocol protocol was not yet implemented for any type and therefore will always fail. + + This warning will disappear once you define a implementation. If the protocol is part of a library, you may define a dummy implementation for development/test. typing violation found at: │ @@ -479,49 +478,54 @@ warnings = [ """ - warning: incompatible value given to string interpolation: + warning: incompatible types given to String.Chars.to_string/1: - data + to_string(data) - it has type: + given types: -dynamic(%Range{})- - but expected a type that implements the String.Chars protocol, it must be one of: + but expected a type that implements the String.Chars protocol. + You either passed the wrong value or you must: - dynamic( - %Date{} or %DateTime{} or %NaiveDateTime{} or %Time{} or %URI{} or %Version{} or - %Version.Requirement{} - ) or atom() or binary() or empty_list() or float() or integer() or non_empty_list(term(), term()) + 1. convert the given value to a string explicitly + (use inspect/1 if you want to convert any data structure to a string) + 2. implement the String.Chars protocol where "data" was given the type: # type: dynamic(%Range{}) - # from: a.ex:3:24 + # from: a.ex:2:24 _.._//_ = data - hint: string interpolation uses the String.Chars protocol to convert a data structure into a string. Either convert the data type into a string upfront or implement the protocol accordingly + hint: the String.Chars protocol is implemented for the following types: + + dynamic( + %Date{} or %DateTime{} or %NaiveDateTime{} or %Time{} or %URI{} or %Version{} or + %Version.Requirement{} + ) or atom() or binary() or empty_list() or float() or integer() or non_empty_list(term(), term()) """, """ - warning: incompatible types given to String.Chars.to_string/1: + warning: incompatible value given to string interpolation: - to_string(data) + data - given types: + it has type: -dynamic(%Range{})- - but expected a type that implements the String.Chars protocol, it must be one of: + but expected a type that implements the String.Chars protocol. + You either passed the wrong value or you must: - dynamic( - %Date{} or %DateTime{} or %NaiveDateTime{} or %Time{} or %URI{} or %Version{} or - %Version.Requirement{} - ) or atom() or binary() or empty_list() or float() or integer() or non_empty_list(term(), term()) + 1. convert the given value to a string explicitly + (use inspect/1 if you want to convert any data structure to a string) + 2. implement the String.Chars protocol where "data" was given the type: # type: dynamic(%Range{}) - # from: a.ex:2:24 + # from: a.ex:3:24 _.._//_ = data """ ] @@ -551,12 +555,11 @@ -dynamic(%Date{})- - but expected a type that implements the Enumerable protocol, it must be one of: + but expected a type that implements the Enumerable protocol. + You either passed the wrong value or you must: - dynamic( - %Date.Range{} or %File.Stream{} or %GenEvent.Stream{} or %HashDict{} or %HashSet{} or - %IO.Stream{} or %MapSet{} or %Range{} or %Stream{} - ) or empty_list() or fun() or non_empty_list(term(), term()) or non_struct_map() + 1. convert the given value to an Enumerable explicitly + 2. implement the Enumerable protocol where "date" was given the type: @@ -564,7 +567,12 @@ # from: a.ex:2:24 %Date{} = date - hint: for-comprehensions use the Enumerable protocol to traverse data structures. Either convert the data type into a list (or another Enumerable) or implement the protocol accordingly + hint: the Enumerable protocol is implemented for the following types: + + dynamic( + %Date.Range{} or %File.Stream{} or %GenEvent.Stream{} or %HashDict{} or %HashSet{} or + %IO.Stream{} or %MapSet{} or %Range{} or %Stream{} + ) or empty_list() or fun() or non_empty_list(term(), term()) or non_struct_map() """, """ warning: incompatible value given to :into option in for-comprehension: @@ -572,6 +580,16 @@ into: Date.utc_today() it has type: + + -dynamic(%Date{})- + + but expected a type that implements the Collectable protocol. + You either passed the wrong value or you forgot to implement the protocol. + + hint: the Collectable protocol is implemented for the following types: + + dynamic(%File.Stream{} or %HashDict{} or %HashSet{} or %IO.Stream{} or %MapSet{}) or binary() or + empty_list() or non_empty_list(term(), term()) or non_struct_map() """, """ warning: incompatible value given to :into option in for-comprehension: @@ -582,12 +600,13 @@ -integer()- - but expected a type that implements the Collectable protocol, it must be one of: + but expected a type that implements the Collectable protocol. + You either passed the wrong value or you forgot to implement the protocol. + + hint: the Collectable protocol is implemented for the following types: dynamic(%File.Stream{} or %HashDict{} or %HashSet{} or %IO.Stream{} or %MapSet{}) or binary() or empty_list() or non_empty_list(term(), term()) or non_struct_map() - - hint: the :into option in for-comprehensions use the Collectable protocol to build its result. Either pass a valid data type or implement the protocol accordingly """ ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/mix/lib/mix/compilers/elixir.ex new/elixir-1.19.1/lib/mix/lib/mix/compilers/elixir.ex --- old/elixir-1.19.0/lib/mix/lib/mix/compilers/elixir.ex 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/mix/lib/mix/compilers/elixir.ex 2025-10-20 17:30:38.000000000 +0200 @@ -432,8 +432,9 @@ has_any_key?(modules_to_recompile, modules) -> # Mark the source as changed so the combination of a timestamp # plus removed beam files (which are removed by update_stale_entries) - # causes it to be recompiled - File.touch!(source, timestamp + 1) + # causes it to be recompiled. Note we don't raise use touch! because + # in case of checkpoints the file may have been removed. + File.touch(source, timestamp + 1) [source] size != last_size or diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/mix/lib/mix/tasks/deps.compile.ex new/elixir-1.19.1/lib/mix/lib/mix/tasks/deps.compile.ex --- old/elixir-1.19.0/lib/mix/lib/mix/tasks/deps.compile.ex 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/mix/lib/mix/tasks/deps.compile.ex 2025-10-20 17:30:38.000000000 +0200 @@ -102,8 +102,11 @@ count = System.get_env("MIX_OS_DEPS_COMPILE_PARTITION_COUNT", "0") |> String.to_integer() + # If all dependencies are local and ok, do not bother starting + # processes as it will likely slow everything down. compiled? = - if count > 1 and length(deps) > 1 do + if count > 1 and match?([_, _ | _], deps) and + not Enum.all?(deps, &(Mix.Dep.ok?(&1) and not &1.scm.fetchable?())) do Mix.shell().info("mix deps.compile running across #{count} OS processes") Mix.Tasks.Deps.Partition.server(deps, count, force?) else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/elixir-1.19.0/lib/mix/lib/mix/tasks/format.ex new/elixir-1.19.1/lib/mix/lib/mix/tasks/format.ex --- old/elixir-1.19.0/lib/mix/lib/mix/tasks/format.ex 2025-10-16 08:52:04.000000000 +0200 +++ new/elixir-1.19.1/lib/mix/lib/mix/tasks/format.ex 2025-10-20 17:30:38.000000000 +0200 @@ -33,7 +33,7 @@ to be used by this task. For example, `["mix.exs", "{config,lib,test}/**/*.{ex,exs}"]`. Patterns are expanded with `Path.wildcard/2`. - * `:excludes` (a list of paths and patterns) - specifies the files to exclude from the + * `:excludes` (a list of paths and patterns) (since v1.19.0) - specifies the files to exclude from the list of inputs to this task. For example, `["config/runtime.exs", "test/**/*.{ex,exs}"]`. Patterns are expanded with `Path.wildcard/2`.
