From 5323767023146a3cd539287da4ea1d6df2d1a904 Mon Sep 17 00:00:00 2001 From: Emiliano Mancuso Date: Sun, 12 Apr 2026 20:36:06 +0100 Subject: [PATCH] Return {0, -1} for missing files in last_modified_and_size/1, closes #15258 --- lib/mix/lib/mix/compilers/elixir.ex | 2 +- lib/mix/lib/mix/utils.ex | 6 +++--- lib/mix/test/mix/utils_test.exs | 4 ++++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/mix/lib/mix/compilers/elixir.ex b/lib/mix/lib/mix/compilers/elixir.ex index bf8a03ef005..63e1e0142fa 100644 --- a/lib/mix/lib/mix/compilers/elixir.ex +++ b/lib/mix/lib/mix/compilers/elixir.ex @@ -500,7 +500,7 @@ defmodule Mix.Compilers.Elixir do defp stale_external?({external, {mtime, size}, digest}, sources_stats) do case sources_stats do - %{^external => {0, 0}} -> + %{^external => {0, -1}} -> digest != nil %{^external => {last_mtime, last_size}} -> diff --git a/lib/mix/lib/mix/utils.ex b/lib/mix/lib/mix/utils.ex index 700235f87ae..94636b8eaf5 100644 --- a/lib/mix/lib/mix/utils.ex +++ b/lib/mix/lib/mix/utils.ex @@ -249,8 +249,8 @@ defmodule Mix.Utils do Returns the date the given path was last modified in posix time and the size. - If the path does not exist, it returns the Unix epoch - (1970-01-01 00:00:00). + If the path does not exist, it returns `{0, -1}` (the Unix epoch + with size -1 to distinguish from actual 0-byte files). """ def last_modified_and_size(path) do now = System.os_time(:second) @@ -268,7 +268,7 @@ defmodule Mix.Utils do {mtime, size} {:error, _} -> - {0, 0} + {0, -1} end end diff --git a/lib/mix/test/mix/utils_test.exs b/lib/mix/test/mix/utils_test.exs index 8c88e7331cc..8548d8df9d8 100644 --- a/lib/mix/test/mix/utils_test.exs +++ b/lib/mix/test/mix/utils_test.exs @@ -58,6 +58,10 @@ defmodule Mix.UtilsTest do assert Mix.Utils.extract_files([""], ".ex") == [] end + test "last_modified_and_size returns {0, -1} for missing files" do + assert Mix.Utils.last_modified_and_size("nonexistent") == {0, -1} + end + test "extract stale" do # 2038-01-01 00:00:00 time = 2_145_916_800