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`.
 

Reply via email to