From 84c3216f9c8c8177ad2b877a625e5b4742b77412 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Fri, 31 May 2024 09:53:02 -0300 Subject: [PATCH 01/15] Adding debug information of tags --- src/resolvers/fossil.cr | 11 +++++++++-- src/resolvers/git.cr | 11 +++++++++-- src/resolvers/hg.cr | 11 +++++++++-- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/resolvers/fossil.cr b/src/resolvers/fossil.cr index b568994c..3923e379 100644 --- a/src/resolvers/fossil.cr +++ b/src/resolvers/fossil.cr @@ -213,9 +213,16 @@ module Shards end protected def versions_from_tags - capture("fossil tag list -R #{Process.quote(local_fossil_file)}") + tags = capture("fossil tag list -R #{Process.quote(local_fossil_file)}") .split('\n') - .compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + + Log.debug { "Tags: #{tags.reject(&.empty?).join(", ")}" } + + version_tags = tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + + Log.debug { "Version tags (vX.Y): #{version_tags.join(", ")}" } + + version_tags end def install_sources(version : Version, install_path : String) diff --git a/src/resolvers/git.cr b/src/resolvers/git.cr index b5559ca3..d8a14733 100644 --- a/src/resolvers/git.cr +++ b/src/resolvers/git.cr @@ -204,9 +204,16 @@ module Shards end protected def versions_from_tags - capture("git tag --list #{GitResolver.git_column_never}") + tags = capture("git tag --list #{GitResolver.git_column_never}") .split('\n') - .compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + + Log.debug { "Tags: #{tags.reject(&.empty?).join(", ")}" } + + version_tags = tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + + Log.debug { "Version tags (vX.Y): #{version_tags.join(", ")}" } + + version_tags end def install_sources(version : Version, install_path : String) diff --git a/src/resolvers/hg.cr b/src/resolvers/hg.cr index 7568b09d..b01677f7 100644 --- a/src/resolvers/hg.cr +++ b/src/resolvers/hg.cr @@ -221,10 +221,17 @@ module Shards end protected def versions_from_tags - capture("hg tags --template #{Process.quote("{tag}\n")}") + tags = capture("hg tags --template #{Process.quote("{tag}\n")}") .lines .sort! - .compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + + Log.debug { "Tags: #{tags.reject(&.empty?).join(", ")}" } + + version_tags = tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + + Log.debug { "Version tags (vX.Y): #{version_tags.join(", ")}" } + + version_tags end def install_sources(version : Version, install_path : String) From c5d79ea5282e92bd0337a784cac577cdb164bbbb Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Fri, 31 May 2024 09:53:28 -0300 Subject: [PATCH 02/15] sugest using --verbose --- src/cli.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli.cr b/src/cli.cr index 668c825e..7d6b7d16 100644 --- a/src/cli.cr +++ b/src/cli.cr @@ -160,6 +160,6 @@ rescue ex : Shards::ParseError ex.to_s(STDERR) exit 1 rescue ex : Shards::Error - Shards::Log.error { ex.message } + Shards::Log.error { ex.message.to_s + "\nYou might find useful information using the --verbose option" } exit 1 end From b3e27a7487d34466be9200f80959386b7ea78ef0 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Fri, 31 May 2024 10:08:28 -0300 Subject: [PATCH 03/15] Don't be redundant when using --verbose --- src/cli.cr | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cli.cr b/src/cli.cr index 7d6b7d16..6c170f6d 100644 --- a/src/cli.cr +++ b/src/cli.cr @@ -160,6 +160,7 @@ rescue ex : Shards::ParseError ex.to_s(STDERR) exit 1 rescue ex : Shards::Error - Shards::Log.error { ex.message.to_s + "\nYou might find useful information using the --verbose option" } + msg = Shards::Log.level == Log::Severity::Debug ? "" : "\nYou might find useful information using the --verbose option" + Shards::Log.error { ex.message.to_s + msg } exit 1 end From e87e8c043ab13cdfc1c9f585cbf7dc3dbff3d4d1 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Wed, 30 Oct 2024 15:39:48 -0300 Subject: [PATCH 04/15] Querying information --- src/cli.cr | 3 +-- src/commands/command.cr | 12 +++++++++++- src/commands/install.cr | 2 +- src/commands/lock.cr | 2 +- src/commands/outdated.cr | 2 +- src/commands/update.cr | 2 +- src/resolvers/crystal.cr | 4 ++++ src/resolvers/fossil.cr | 13 +++++++------ src/resolvers/git.cr | 13 +++++++------ src/resolvers/hg.cr | 16 +++++++++------- src/resolvers/path.cr | 4 ++++ src/resolvers/resolver.cr | 2 ++ 12 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/cli.cr b/src/cli.cr index 37567ce6..26437e08 100644 --- a/src/cli.cr +++ b/src/cli.cr @@ -166,7 +166,6 @@ rescue ex : Shards::ParseError ex.to_s(STDERR) exit 1 rescue ex : Shards::Error - msg = Shards::Log.level == Log::Severity::Debug ? "" : "\nYou might find useful information using the --verbose option" - Shards::Log.error { ex.message.to_s + msg } + Shards::Log.error { ex.message.to_s } exit 1 end diff --git a/src/commands/command.cr b/src/commands/command.cr index 3695a22e..9fc46a6e 100644 --- a/src/commands/command.cr +++ b/src/commands/command.cr @@ -73,8 +73,18 @@ module Shards Shards::Lock.write(packages, override_path, LOCK_FILENAME) end - def handle_resolver_errors(&) + private def log_available_tags(conflicts) + conflicts.join(separator: "\n") do |k, v| + "For #{k} the available tags are: [#{v.requirement.resolver.available_tags.join(", ")}]" + end + end + + def handle_resolver_errors(solver, &) yield + rescue e : Molinillo::VersionConflict(Shards::Dependency, Shards::Spec) + Log.error { e.message } + Log.error { log_available_tags(e.conflicts) } + raise Shards::Error.new("Failed to resolve dependencies") rescue e : Molinillo::ResolverError Log.error { e.message } raise Shards::Error.new("Failed to resolve dependencies") diff --git a/src/commands/install.cr b/src/commands/install.cr index 515e24fe..42a9b668 100644 --- a/src/commands/install.cr +++ b/src/commands/install.cr @@ -21,7 +21,7 @@ module Shards solver.prepare(development: Shards.with_development?) - packages = handle_resolver_errors { solver.solve } + packages = handle_resolver_errors(solver) { solver.solve } if Shards.frozen? validate(packages) diff --git a/src/commands/lock.cr b/src/commands/lock.cr index b69c5a1d..90342cb5 100644 --- a/src/commands/lock.cr +++ b/src/commands/lock.cr @@ -26,7 +26,7 @@ module Shards solver.prepare(development: Shards.with_development?) - packages = handle_resolver_errors { solver.solve } + packages = handle_resolver_errors(solver) { solver.solve } return if packages.empty? if print diff --git a/src/commands/outdated.cr b/src/commands/outdated.cr index 89794706..ad1c144b 100644 --- a/src/commands/outdated.cr +++ b/src/commands/outdated.cr @@ -18,7 +18,7 @@ module Shards solver = MolinilloSolver.new(spec, override, prereleases: @prereleases) solver.prepare(development: Shards.with_development?) - packages = handle_resolver_errors { solver.solve } + packages = handle_resolver_errors(solver) { solver.solve } packages.each { |package| analyze(package) } if @up_to_date diff --git a/src/commands/update.cr b/src/commands/update.cr index 00364be0..3acd1dca 100644 --- a/src/commands/update.cr +++ b/src/commands/update.cr @@ -19,7 +19,7 @@ module Shards solver.prepare(development: Shards.with_development?) - packages = handle_resolver_errors { solver.solve } + packages = handle_resolver_errors(solver) { solver.solve } install(packages) if generate_lockfile?(packages) diff --git a/src/resolvers/crystal.cr b/src/resolvers/crystal.cr index a7570a1d..b6e8192b 100644 --- a/src/resolvers/crystal.cr +++ b/src/resolvers/crystal.cr @@ -10,6 +10,10 @@ module Shards [Version.new Shards.crystal_version] end + def available_tags : Array(String) + [Shards.crystal_version] + end + def read_spec(version : Version) : String? nil end diff --git a/src/resolvers/fossil.cr b/src/resolvers/fossil.cr index 3923e379..0164d886 100644 --- a/src/resolvers/fossil.cr +++ b/src/resolvers/fossil.cr @@ -212,17 +212,18 @@ module Shards end end - protected def versions_from_tags + def available_tags : Array(String) tags = capture("fossil tag list -R #{Process.quote(local_fossil_file)}") .split('\n') - Log.debug { "Tags: #{tags.reject(&.empty?).join(", ")}" } - - version_tags = tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + tags.reject(&.empty?) + end - Log.debug { "Version tags (vX.Y): #{version_tags.join(", ")}" } + protected def versions_from_tags + tags = capture("fossil tag list -R #{Process.quote(local_fossil_file)}") + .split('\n') - version_tags + tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } end def install_sources(version : Version, install_path : String) diff --git a/src/resolvers/git.cr b/src/resolvers/git.cr index 8cd383d9..fa04d1c8 100644 --- a/src/resolvers/git.cr +++ b/src/resolvers/git.cr @@ -203,17 +203,18 @@ module Shards end end - protected def versions_from_tags + def available_tags : Array(String) tags = capture("git tag --list #{GitResolver.git_column_never}") .split('\n') - Log.debug { "Tags: #{tags.reject(&.empty?).join(", ")}" } - - version_tags = tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + tags.reject(&.empty?) + end - Log.debug { "Version tags (vX.Y): #{version_tags.join(", ")}" } + protected def versions_from_tags + tags = capture("git tag --list #{GitResolver.git_column_never}") + .split('\n') - version_tags + tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } end def install_sources(version : Version, install_path : String) diff --git a/src/resolvers/hg.cr b/src/resolvers/hg.cr index b01677f7..085e1277 100644 --- a/src/resolvers/hg.cr +++ b/src/resolvers/hg.cr @@ -186,6 +186,14 @@ module Shards rescue Error end + def available_tags : Array(String) + tags = capture("hg tags --template #{Process.quote("{tag}\n")}") + .lines + .sort! + + tags.reject(&.empty?) + end + def available_releases : Array(Version) update_local_cache versions_from_tags @@ -225,13 +233,7 @@ module Shards .lines .sort! - Log.debug { "Tags: #{tags.reject(&.empty?).join(", ")}" } - - version_tags = tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } - - Log.debug { "Version tags (vX.Y): #{version_tags.join(", ")}" } - - version_tags + tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } end def install_sources(version : Version, install_path : String) diff --git a/src/resolvers/path.cr b/src/resolvers/path.cr index 16915edd..9e36dfeb 100644 --- a/src/resolvers/path.cr +++ b/src/resolvers/path.cr @@ -24,6 +24,10 @@ module Shards [spec(nil).version] end + def available_tags : Array(String) + [spec(nil).version.to_s] + end + def local_path source end diff --git a/src/resolvers/resolver.cr b/src/resolvers/resolver.cr index 9adfe7cd..07aa080d 100644 --- a/src/resolvers/resolver.cr +++ b/src/resolvers/resolver.cr @@ -54,6 +54,8 @@ module Shards end end + abstract def available_tags : Array(String) + abstract def available_releases : Array(Version) def latest_version_for_ref(ref : Ref?) : Version From 73b472a57d774db7c6d6d77cb65307dfcc4e9d1a Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Fri, 1 Nov 2024 15:59:53 -0300 Subject: [PATCH 05/15] Improved output --- src/commands/command.cr | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/commands/command.cr b/src/commands/command.cr index 9fc46a6e..63c8c965 100644 --- a/src/commands/command.cr +++ b/src/commands/command.cr @@ -1,6 +1,7 @@ require "../lock" require "../spec" require "../override" +require "levenshtein" module Shards abstract class Command @@ -75,7 +76,19 @@ module Shards private def log_available_tags(conflicts) conflicts.join(separator: "\n") do |k, v| - "For #{k} the available tags are: [#{v.requirement.resolver.available_tags.join(", ")}]" + req = v.requirement + tags = req.resolver.available_tags + req = req.requirement + + if req.is_a?(Version) || (req.is_a?(VersionReq) && req.patterns.size == 1 && req.patterns[0] !~ /^(<|>|=)/) + req = "v" + req.to_s + found = Levenshtein.find(req, tags, 6) + "For #{k} the closest available tag to #{req} is: #{found}" + elsif tags.empty? + "#{k} doesn't have any tag" + else + "For #{k} the last available tags are #{tags.reverse.first(5).join(", ")}" + end end end From 410f7e793b221f424b6f8acd2dd95a8a906dbd30 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Fri, 1 Nov 2024 16:05:45 -0300 Subject: [PATCH 06/15] fixup --- src/commands/command.cr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/command.cr b/src/commands/command.cr index 63c8c965..21d5975b 100644 --- a/src/commands/command.cr +++ b/src/commands/command.cr @@ -77,7 +77,7 @@ module Shards private def log_available_tags(conflicts) conflicts.join(separator: "\n") do |k, v| req = v.requirement - tags = req.resolver.available_tags + tags = req.resolver.available_tags.reverse req = req.requirement if req.is_a?(Version) || (req.is_a?(VersionReq) && req.patterns.size == 1 && req.patterns[0] !~ /^(<|>|=)/) @@ -87,7 +87,7 @@ module Shards elsif tags.empty? "#{k} doesn't have any tag" else - "For #{k} the last available tags are #{tags.reverse.first(5).join(", ")}" + "For #{k} the last available tags are #{tags.first(5).join(", ")}" end end end From 939bb89fe860bc68bfefbcfbd2787e4516b51cd0 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Mon, 4 Nov 2024 09:26:14 -0300 Subject: [PATCH 07/15] Formatter compliance --- spec/integration/subcommand_spec.cr | 2 +- src/package.cr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/integration/subcommand_spec.cr b/spec/integration/subcommand_spec.cr index 89226a04..86da59c0 100644 --- a/spec/integration/subcommand_spec.cr +++ b/spec/integration/subcommand_spec.cr @@ -32,7 +32,7 @@ describe "subcommand" do end end -private def with_path(path) +private def with_path(path, &) old_path = ENV["PATH"] ENV["PATH"] = "#{File.expand_path(path)}#{Process::PATH_DELIMITER}#{ENV["PATH"]}" yield diff --git a/src/package.cr b/src/package.cr index 3dfe007c..09f8a70b 100644 --- a/src/package.cr +++ b/src/package.cr @@ -139,7 +139,7 @@ module Shards end end - private def each_executable_path(name) + private def each_executable_path(name, &) exe = Shards::Helpers.exe(name) yield Path["bin", exe] yield Path["bin", name] unless name == exe From 6895cd729a19f39858c4f7bcbebe3d3f128fab1b Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Mon, 4 Nov 2024 11:13:27 -0300 Subject: [PATCH 08/15] removing warning for nightly --- src/molinillo_solver.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/molinillo_solver.cr b/src/molinillo_solver.cr index 4ced81f0..9c2fffdd 100644 --- a/src/molinillo_solver.cr +++ b/src/molinillo_solver.cr @@ -57,7 +57,7 @@ module Shards count += 1 active.add(1) while active.get > Shards.jobs - sleep 0.1 + sleep 0.1.seconds end spawn do begin From 8d56a6a30658b1750ed25c85e7da87eac693f021 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Mon, 4 Nov 2024 11:36:11 -0300 Subject: [PATCH 09/15] Switch to releases, and more information for empty releases --- src/commands/command.cr | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/commands/command.cr b/src/commands/command.cr index 21d5975b..d1b90adf 100644 --- a/src/commands/command.cr +++ b/src/commands/command.cr @@ -77,17 +77,24 @@ module Shards private def log_available_tags(conflicts) conflicts.join(separator: "\n") do |k, v| req = v.requirement - tags = req.resolver.available_tags.reverse + resolver = req.resolver + releases = resolver.available_releases.map(&.to_s).reverse req = req.requirement - if req.is_a?(Version) || (req.is_a?(VersionReq) && req.patterns.size == 1 && req.patterns[0] !~ /^(<|>|=)/) - req = "v" + req.to_s - found = Levenshtein.find(req, tags, 6) - "For #{k} the closest available tag to #{req} is: #{found}" - elsif tags.empty? - "#{k} doesn't have any tag" + if releases.empty? + tags = resolver.available_tags.reverse!.first(5) + if tags.empty? + info = "And it doesn't have any tags either." + else + info = "For information, these are the latest tags: #{tags.join(", ")}." + end + "#{k} doesn't have any release. #{info} Refer to the shards manual for details." + elsif req.is_a?(Version) || (req.is_a?(VersionReq) && req.patterns.size == 1 && req.patterns[0] !~ /^(<|>|=)/) + req = req.to_s + found = Levenshtein.find(req, releases) + "For #{k} the closest available release to #{req} is: #{found}." else - "For #{k} the last available tags are #{tags.first(5).join(", ")}" + "For #{k} the last available releases are #{releases.first(5).join(", ")}." end end end From c7f16339dec477d4901dd38b3b49ea7b88af38b9 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Mon, 4 Nov 2024 11:45:22 -0300 Subject: [PATCH 10/15] Adding tag information in version --- src/commands/command.cr | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/commands/command.cr b/src/commands/command.cr index d1b90adf..4e5f15dc 100644 --- a/src/commands/command.cr +++ b/src/commands/command.cr @@ -78,21 +78,22 @@ module Shards conflicts.join(separator: "\n") do |k, v| req = v.requirement resolver = req.resolver + tags = resolver.available_tags.reverse!.first(5) releases = resolver.available_releases.map(&.to_s).reverse req = req.requirement if releases.empty? - tags = resolver.available_tags.reverse!.first(5) if tags.empty? info = "And it doesn't have any tags either." else info = "For information, these are the latest tags: #{tags.join(", ")}." end - "#{k} doesn't have any release. #{info} Refer to the shards manual for details." + "#{k} doesn't have any release. #{info}" elsif req.is_a?(Version) || (req.is_a?(VersionReq) && req.patterns.size == 1 && req.patterns[0] !~ /^(<|>|=)/) req = req.to_s found = Levenshtein.find(req, releases) - "For #{k} the closest available release to #{req} is: #{found}." + info = "For information, these are the latest tags: #{tags.join(", ")}." + "For #{k} the closest available release to #{req} is: #{found}. #{info}" else "For #{k} the last available releases are #{releases.first(5).join(", ")}." end From 2244a4e7eac6437196d4dfad67d61cd53a335368 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Mon, 4 Nov 2024 11:53:31 -0300 Subject: [PATCH 11/15] remove_empty: true --- src/resolvers/fossil.cr | 4 +--- src/resolvers/git.cr | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/resolvers/fossil.cr b/src/resolvers/fossil.cr index 0164d886..8cd5e438 100644 --- a/src/resolvers/fossil.cr +++ b/src/resolvers/fossil.cr @@ -214,9 +214,7 @@ module Shards def available_tags : Array(String) tags = capture("fossil tag list -R #{Process.quote(local_fossil_file)}") - .split('\n') - - tags.reject(&.empty?) + .split('\n', remove_empty: true) end protected def versions_from_tags diff --git a/src/resolvers/git.cr b/src/resolvers/git.cr index fa04d1c8..7cb00123 100644 --- a/src/resolvers/git.cr +++ b/src/resolvers/git.cr @@ -205,9 +205,7 @@ module Shards def available_tags : Array(String) tags = capture("git tag --list #{GitResolver.git_column_never}") - .split('\n') - - tags.reject(&.empty?) + .split('\n', remove_empty: true) end protected def versions_from_tags From b4d84dc205405d4376a555904b414b6a815bc21d Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Mon, 4 Nov 2024 11:54:39 -0300 Subject: [PATCH 12/15] DRY --- src/resolvers/fossil.cr | 5 +---- src/resolvers/git.cr | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/resolvers/fossil.cr b/src/resolvers/fossil.cr index 8cd5e438..acce4f14 100644 --- a/src/resolvers/fossil.cr +++ b/src/resolvers/fossil.cr @@ -218,10 +218,7 @@ module Shards end protected def versions_from_tags - tags = capture("fossil tag list -R #{Process.quote(local_fossil_file)}") - .split('\n') - - tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + available_tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } end def install_sources(version : Version, install_path : String) diff --git a/src/resolvers/git.cr b/src/resolvers/git.cr index 7cb00123..57e2534d 100644 --- a/src/resolvers/git.cr +++ b/src/resolvers/git.cr @@ -209,10 +209,7 @@ module Shards end protected def versions_from_tags - tags = capture("git tag --list #{GitResolver.git_column_never}") - .split('\n') - - tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + tags = available_tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } end def install_sources(version : Version, install_path : String) From ed7525b081d1ba253104e3e9bd7b6f22ec37a1b8 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Wed, 6 Nov 2024 11:19:39 -0300 Subject: [PATCH 13/15] style & uniformity --- src/resolvers/fossil.cr | 4 ++-- src/resolvers/git.cr | 6 +++--- src/resolvers/hg.cr | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/resolvers/fossil.cr b/src/resolvers/fossil.cr index acce4f14..85361787 100644 --- a/src/resolvers/fossil.cr +++ b/src/resolvers/fossil.cr @@ -213,8 +213,8 @@ module Shards end def available_tags : Array(String) - tags = capture("fossil tag list -R #{Process.quote(local_fossil_file)}") - .split('\n', remove_empty: true) + capture("fossil tag list -R #{Process.quote(local_fossil_file)}") + .lines.reject!(&.empty?) end protected def versions_from_tags diff --git a/src/resolvers/git.cr b/src/resolvers/git.cr index 57e2534d..6308e554 100644 --- a/src/resolvers/git.cr +++ b/src/resolvers/git.cr @@ -204,12 +204,12 @@ module Shards end def available_tags : Array(String) - tags = capture("git tag --list #{GitResolver.git_column_never}") - .split('\n', remove_empty: true) + capture("git tag --list #{GitResolver.git_column_never}") + .lines.reject!(&.empty?) end protected def versions_from_tags - tags = available_tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } + available_tags.compact_map { |tag| Version.new($1) if tag =~ VERSION_TAG } end def install_sources(version : Version, install_path : String) diff --git a/src/resolvers/hg.cr b/src/resolvers/hg.cr index 085e1277..e996cef3 100644 --- a/src/resolvers/hg.cr +++ b/src/resolvers/hg.cr @@ -191,7 +191,7 @@ module Shards .lines .sort! - tags.reject(&.empty?) + tags.reject!(&.empty?) end def available_releases : Array(Version) From d7246a8c0e3d9d150d29f34b4a9c91fccce396b4 Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Wed, 6 Nov 2024 11:35:46 -0300 Subject: [PATCH 14/15] Improved error --- src/commands/command.cr | 43 ++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/commands/command.cr b/src/commands/command.cr index 4e5f15dc..e3615404 100644 --- a/src/commands/command.cr +++ b/src/commands/command.cr @@ -75,27 +75,31 @@ module Shards end private def log_available_tags(conflicts) - conflicts.join(separator: "\n") do |k, v| - req = v.requirement - resolver = req.resolver - tags = resolver.available_tags.reverse!.first(5) - releases = resolver.available_releases.map(&.to_s).reverse - req = req.requirement - - if releases.empty? - if tags.empty? - info = "And it doesn't have any tags either." + String.build do |str| + conflicts.join(separator: "\n") do |k, v| + req = v.requirement + resolver = req.resolver + tags = resolver.available_tags.reverse!.first(5) + releases = resolver.available_releases.map(&.to_s).reverse + req = req.requirement + + str << "- #{k} (#{req}): " + if releases.empty? + str << "It doesn't have any release. " + if tags.empty? + str << "And it doesn't have any tags either." + else + str << "These are the latest tags: #{tags.join(", ")}." + end + elsif req.is_a?(Version) || (req.is_a?(VersionReq) && req.patterns.size == 1 && req.patterns[0] !~ /^(<|>|=)/) + req = req.to_s + found = Levenshtein.find(req, releases, 6) || "none" + info = "These are the latest tags: #{tags.join(", ")}." + str << "The closest available release to #{req} is: #{found}. #{info}" else - info = "For information, these are the latest tags: #{tags.join(", ")}." + str << "The last available releases are #{releases.first(5).join(", ")}." end - "#{k} doesn't have any release. #{info}" - elsif req.is_a?(Version) || (req.is_a?(VersionReq) && req.patterns.size == 1 && req.patterns[0] !~ /^(<|>|=)/) - req = req.to_s - found = Levenshtein.find(req, releases) - info = "For information, these are the latest tags: #{tags.join(", ")}." - "For #{k} the closest available release to #{req} is: #{found}. #{info}" - else - "For #{k} the last available releases are #{releases.first(5).join(", ")}." + str << "\n" end end end @@ -103,7 +107,6 @@ module Shards def handle_resolver_errors(solver, &) yield rescue e : Molinillo::VersionConflict(Shards::Dependency, Shards::Spec) - Log.error { e.message } Log.error { log_available_tags(e.conflicts) } raise Shards::Error.new("Failed to resolve dependencies") rescue e : Molinillo::ResolverError From 267fe37d7d401d7973a79ffeb4f71c120f06d12a Mon Sep 17 00:00:00 2001 From: Beta Ziliani Date: Wed, 6 Nov 2024 14:12:07 -0300 Subject: [PATCH 15/15] Considering the case of multiple chained dependencies --- src/commands/command.cr | 50 ++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/commands/command.cr b/src/commands/command.cr index e3615404..8c2ef279 100644 --- a/src/commands/command.cr +++ b/src/commands/command.cr @@ -76,30 +76,38 @@ module Shards private def log_available_tags(conflicts) String.build do |str| - conflicts.join(separator: "\n") do |k, v| - req = v.requirement - resolver = req.resolver - tags = resolver.available_tags.reverse!.first(5) - releases = resolver.available_releases.map(&.to_s).reverse - req = req.requirement - - str << "- #{k} (#{req}): " - if releases.empty? - str << "It doesn't have any release. " - if tags.empty? - str << "And it doesn't have any tags either." + shard_source_dependencys = conflicts.flat_map { |k, v| v.requirements.flat_map { |source, deps| deps.map { |dep| {k, source, dep} } } } + if shard_source_dependencys.size > 1 + str << "Unable to satisfy the following requirements:\n\n" + shard_source_dependencys.each do |shard, source, dependency| + str << "- `#{shard} (#{dependency.requirement})` required by `#{source}`\n" + end + else + str << "Unable to satisfy the following requirement:\n\n" + shard_source_dependencys.each do |shard, source, dependency| + resolver = dependency.resolver + tags = resolver.available_tags.reverse!.first(5) + releases = resolver.available_releases.map(&.to_s).reverse + req = dependency.requirement + + str << "- `#{shard} (#{req})` required by `#{source}`: " + if releases.empty? + str << "It doesn't have any release. " + if tags.empty? + str << "And it doesn't have any tags either." + else + str << "These are the latest tags: #{tags.join(", ")}." + end + elsif req.is_a?(Version) || (req.is_a?(VersionReq) && req.patterns.size == 1 && req.patterns[0] !~ /^(<|>|=)/) + req = req.to_s + found = Levenshtein.find(req, releases, 6) || "none" + info = "These are the latest tags: #{tags.join(", ")}." + str << "The closest available release to #{req} is: #{found}. #{info}" else - str << "These are the latest tags: #{tags.join(", ")}." + str << "The last available releases are #{releases.first(5).join(", ")}." end - elsif req.is_a?(Version) || (req.is_a?(VersionReq) && req.patterns.size == 1 && req.patterns[0] !~ /^(<|>|=)/) - req = req.to_s - found = Levenshtein.find(req, releases, 6) || "none" - info = "These are the latest tags: #{tags.join(", ")}." - str << "The closest available release to #{req} is: #{found}. #{info}" - else - str << "The last available releases are #{releases.first(5).join(", ")}." + str << "\n" end - str << "\n" end end end