-
-
Notifications
You must be signed in to change notification settings - Fork 807
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
suggest unlocking locked pkgs that cause dep resolution failures #3970
base: main
Are you sure you want to change the base?
Conversation
fc51146
to
d40fb24
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking good! Thank you!
I think the logic for deciding when to offer isn't quite right at the moment, I've left comment inline.
Could you also remove the new error variants that have been added please- we don't want to change anything about the errors shown in this case.
compiler-core/src/error.rs
Outdated
}) | ||
ResolutionError::Failure(err) => { | ||
let default_msg = format!("Dependency resolution was cancelled. {err}"); | ||
if err.contains(", but it is locked to") { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this logic is correct. That error message is created when a locked version falls outside the requested version constraint, but that's not the situation in which we want to offer to unlock packages. We want to unlock if there's a conflict and any of the packages in the conflict are locked to specific versions.
I don't think such logic should be in the error module as it is only concerned with the definition, construction, and displaying of errors. It doesn't know anything about the wider context of the program or why errors would be emitted.
For sure, ty for review. And yeah I'll revisit the error logic and remove the |
Need anything else from me on this? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you! I've left a few small comments inline, otherwise nearly ready to go. Would you mind updating the changelog also please 🙏
"An unrecoverable error happened while solving dependencies: gleam_stdlib is specified with the requirement `~> 0.1.0`, but it is locked to 0.2.0, which is incompatible." | ||
), | ||
_ => panic!("wrong error: {err}"), | ||
} | ||
} | ||
|
||
#[test] | ||
fn resolution_locked_version_doesnt_satisfy_requirements_locked() { | ||
// we're creating a dependency logging v1.4.0 that requires gleam_stdlib v0.40.0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// we're creating a dependency logging v1.4.0 that requires gleam_stdlib v0.40.0 | |
// We're creating a dependency logging v1.4.0 that requires gleam_stdlib v0.40.0 |
@@ -789,14 +790,72 @@ mod tests { | |||
.unwrap_err(); | |||
|
|||
match err { | |||
Error::DependencyResolutionFailed(msg) => assert_eq!( | |||
msg, | |||
Error::DependencyResolutionFailed{error, locked_conflicts: _} => assert_eq!( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like you need to run the formatter here!
}, | ||
); | ||
|
||
// now try and resolve versions with gleam_stdlib v0.20.0 in lock. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// now try and resolve versions with gleam_stdlib v0.20.0 in lock. | |
// Now try and resolve versions with gleam_stdlib v0.20.0 in lock. |
) | ||
.unwrap_err(); | ||
|
||
// expect failure |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// expect failure | |
// Expect failure |
The conflicting packages are: | ||
let conflict_names: Vec<EcoString> = conflicting_packages | ||
.iter() | ||
.map(|pkg| (*pkg).to_string().into()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
str -> ecostring rather than str -> string -> ecostring please
error: format!( | ||
"Unable to find compatible versions for the version constraints in your gleam.toml.\n\ | ||
The conflicting packages are:\n{}", | ||
locked_conflicts.iter().map(|s| format!("- {s}")).join("\n") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why are only some of the conflicting packages are listed in this case? Wouldn't we want to show them all? If not we need to update the message to say this is only a subset of them.
Resolves #3622