Skip to content

Commit 6f76737

Browse files
flatla.smolnikovericmj
authored
Fix within-requirements option in mix hex.outdated (#1107)
Co-authored-by: a.smolnikov <[email protected]> Co-authored-by: Eric Meadows-Jönsson <[email protected]>
1 parent 73736d0 commit 6f76737

File tree

2 files changed

+77
-19
lines changed

2 files changed

+77
-19
lines changed

lib/mix/tasks/hex.outdated.ex

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -198,21 +198,11 @@ defmodule Mix.Tasks.Hex.Outdated do
198198
diff_message = maybe_diff_message(diff_links)
199199
Hex.Shell.info(["\n", base_message, diff_message])
200200

201-
any_outdated? = any_outdated?(versions)
202-
req_met? = any_req_matches?(versions)
201+
outdated = outdated(versions)
202+
any_updatable? = any_possible_to_update?(outdated)
203203

204-
cond do
205-
any_outdated? && opts[:within_requirements] && req_met? ->
206-
Mix.Tasks.Hex.set_exit_code(1)
207-
208-
any_outdated? && opts[:within_requirements] && not req_met? ->
209-
nil
210-
211-
any_outdated? ->
212-
Mix.Tasks.Hex.set_exit_code(1)
213-
214-
true ->
215-
nil
204+
if outdated != [] && (!opts[:within_requirements] || any_updatable?) do
205+
Mix.Tasks.Hex.set_exit_code(1)
216206
end
217207
end
218208
end
@@ -325,8 +315,8 @@ defmodule Mix.Tasks.Hex.Outdated do
325315
defp version_match?(_version, nil), do: true
326316
defp version_match?(version, req), do: Version.match?(version, req)
327317

328-
defp any_outdated?(versions) do
329-
Enum.any?(versions, fn [_package, _dep_only, lock, latest, _requirements] ->
318+
defp outdated(versions) do
319+
Enum.filter(versions, fn [_package, _dep_only, lock, latest, _requirements] ->
330320
Version.compare(lock, latest) == :lt
331321
end)
332322
end
@@ -355,8 +345,8 @@ defmodule Mix.Tasks.Hex.Outdated do
355345
end
356346
end
357347

358-
defp any_req_matches?(versions) do
359-
Enum.any?(versions, fn [_package, _dep_only, _lock, latest, requirements] ->
348+
defp any_possible_to_update?(outdated_versions) do
349+
Enum.any?(outdated_versions, fn [_package, _dep_only, _lock, latest, requirements] ->
360350
req_matches?(requirements, latest)
361351
end)
362352
end

test/mix/tasks/hex.outdated_test.exs

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@ defmodule Mix.Tasks.Hex.OutdatedTest do
5252
end
5353
end
5454

55+
defmodule UpdateNotPossibleApp.MixProject do
56+
def project do
57+
[
58+
app: :outdated_app,
59+
version: "0.0.1",
60+
deps: [
61+
{:baz, "0.1.0"},
62+
{:bar, "0.1.0"}
63+
]
64+
]
65+
end
66+
end
67+
5568
defmodule WithoutHexDeps.MixProject do
5669
def project do
5770
[
@@ -323,6 +336,61 @@ defmodule Mix.Tasks.Hex.OutdatedTest do
323336
end)
324337
end
325338

339+
test "outdated --all --within-requirements (update not possible)" do
340+
Mix.Project.push(UpdateNotPossibleApp.MixProject)
341+
342+
in_tmp(fn ->
343+
set_home_tmp()
344+
Mix.Dep.Lock.write(%{foo: {:hex, :foo, "0.1.0"}})
345+
346+
Mix.Task.run("deps.get")
347+
flush()
348+
349+
assert Mix.Task.run("hex.outdated", ["--all", "--within-requirements"]) ==
350+
nil
351+
352+
bar =
353+
[
354+
[:bright, "bar", :reset],
355+
[" ", :reset],
356+
[" ", "0.1.0", :reset],
357+
[" ", :green, "0.1.0", :reset],
358+
[" ", :green, "Up-to-date", :reset],
359+
" "
360+
]
361+
|> IO.ANSI.format()
362+
|> List.to_string()
363+
364+
baz =
365+
[
366+
[:bright, "baz", :reset],
367+
[" ", :reset],
368+
[" ", "0.1.0", :reset],
369+
[" ", :green, "0.1.0", :reset],
370+
[" ", :green, "Up-to-date", :reset],
371+
" "
372+
]
373+
|> IO.ANSI.format()
374+
|> List.to_string()
375+
376+
foo =
377+
[
378+
[:bright, "foo", :reset],
379+
[" ", :reset],
380+
[" ", "0.1.0", :reset],
381+
[" ", :red, "0.1.1", :reset],
382+
[" ", :red, "Update not possible", :reset],
383+
" "
384+
]
385+
|> IO.ANSI.format()
386+
|> List.to_string()
387+
388+
assert_received {:mix_shell, :info, [^bar]}
389+
assert_received {:mix_shell, :info, [^baz]}
390+
assert_received {:mix_shell, :info, [^foo]}
391+
end)
392+
end
393+
326394
test "outdated --all --within-requirements (not outdated)" do
327395
Mix.Project.push(NotOutdatedApp.MixProject)
328396

@@ -709,7 +777,7 @@ defmodule Mix.Tasks.Hex.OutdatedTest do
709777

710778
catch_throw(Mix.Task.run("hex.outdated", ["--only", "dev,test"]))
711779

712-
# Should show dependencies with :only set to :dev or :test
780+
# Should show dependencies with :only set to :dev or :test
713781
# This should include ex_doc (dev) and plug (test)
714782
# bypass has [:dev, :test] which displays as "dev,test" but should match both "dev" and "test" individually
715783
output_lines =

0 commit comments

Comments
 (0)