mirror of
https://github.com/l0ng-ai/openidea.git
synced 2026-11-13 04:34:21 -10:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
87be8cfcf2 |
No files matched your search
@@ -270,6 +270,13 @@ fn run(
|
||||
|
||||
/// The first error lines of a failed build, for the tool window.
|
||||
pub(crate) fn error_summary(text: &str) -> String {
|
||||
// The JVM's "could not find or load main class" (localized) when `gradlew` has no jar.
|
||||
if text.contains("org.gradle.wrapper.GradleWrapperMain") {
|
||||
return "gradle/wrapper/gradle-wrapper.jar is missing (often excluded by a `*.jar` rule in .gitignore). \
|
||||
Restore it, run `gradle wrapper` with an installed Gradle, or choose Distribution: Local installation \
|
||||
in Settings › Build, Execution, Deployment › Gradle."
|
||||
.to_owned();
|
||||
}
|
||||
let lines: Vec<&str> = text
|
||||
.lines()
|
||||
.filter(|l| {
|
||||
@@ -909,6 +916,8 @@ mod tests {
|
||||
let text = "[INFO] x\n[ERROR] Failed to execute goal\n[ERROR] \n[ERROR] Re-run Maven using -X\n";
|
||||
assert_eq!(error_summary(text), "Failed to execute goal");
|
||||
assert_eq!(error_summary("one\nlast line\n\n"), "last line");
|
||||
let missing_jar = "错误: 找不到或无法加载主类 org.gradle.wrapper.GradleWrapperMain\n";
|
||||
assert!(error_summary(missing_jar).starts_with("gradle/wrapper/gradle-wrapper.jar is missing"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -323,6 +323,18 @@ fn resolve_gradle_command(root: &Path, build_dir: &Path, s: &Settings, use_wrapp
|
||||
}
|
||||
let wrapper = build_dir.join(if cfg!(windows) { "gradlew.bat" } else { "gradlew" });
|
||||
if use_wrapper && wrapper.is_file() {
|
||||
// `gradlew` can't start without its jar, which `.gitignore`s with `*.jar` often leave
|
||||
// out: run the distribution the wrapper already unpacked instead.
|
||||
if build_dir.join("gradle/wrapper/gradle-wrapper.jar").is_file() {
|
||||
return wrapper;
|
||||
}
|
||||
let home = setting_path(root, &g.user_home)
|
||||
.or_else(|| std::env::var_os("GRADLE_USER_HOME").map(PathBuf::from))
|
||||
.or_else(|| Some(crate::home_dir()?.join(".gradle")));
|
||||
if let Some(gradle) = home.and_then(|home| unpacked_wrapper_distribution(build_dir, &home)) {
|
||||
return gradle;
|
||||
}
|
||||
// Nothing to run instead: the wrapper's failure explains what is missing.
|
||||
return wrapper;
|
||||
}
|
||||
pinned::pinned_install(build_dir, Tool::Gradle)
|
||||
@@ -330,6 +342,21 @@ fn resolve_gradle_command(root: &Path, build_dir: &Path, s: &Settings, use_wrapp
|
||||
.unwrap_or_else(|| name.into())
|
||||
}
|
||||
|
||||
/// `bin/gradle` of the distribution `gradle/wrapper/gradle-wrapper.properties` names, once the
|
||||
/// wrapper has unpacked it in `<gradle_user_home>/wrapper/dists` (and marked it complete).
|
||||
fn unpacked_wrapper_distribution(build_dir: &Path, gradle_user_home: &Path) -> Option<PathBuf> {
|
||||
let properties = std::fs::read_to_string(build_dir.join("gradle/wrapper/gradle-wrapper.properties")).ok()?;
|
||||
let url = properties.lines().find_map(|line| line.trim().strip_prefix("distributionUrl="))?;
|
||||
let zip = url.trim().replace("\\:", ":").rsplit('/').next()?.to_owned();
|
||||
let name = zip.strip_suffix(".zip")?;
|
||||
let gradle = if cfg!(windows) { "gradle.bat" } else { "gradle" };
|
||||
// One directory per distribution URL hash, each holding the unpacked `gradle-<version>`.
|
||||
let hashes = std::fs::read_dir(gradle_user_home.join("wrapper/dists").join(name)).ok()?;
|
||||
hashes.flatten().map(|e| e.path()).filter(|dir| dir.join(format!("{zip}.ok")).is_file()).find_map(|dir| {
|
||||
std::fs::read_dir(&dir).ok()?.flatten().map(|e| e.path().join("bin").join(gradle)).find(|p| p.is_file())
|
||||
})
|
||||
}
|
||||
|
||||
fn gradle_run_jdk<'a>(
|
||||
release: Option<u32>,
|
||||
configured: Option<&'a crate::java::Jdk>,
|
||||
|
||||
@@ -1866,6 +1866,37 @@ fn max_java_picks_an_older_jdk() {
|
||||
assert_eq!(free.env["JAVA_HOME"], j25.home.to_string_lossy());
|
||||
}
|
||||
|
||||
/// #3086: `gradle-wrapper.jar` excluded by a `*.jar` rule in `.gitignore`: `gradlew` can't
|
||||
/// start, so the distribution the wrapper already unpacked runs instead.
|
||||
#[test]
|
||||
fn gradle_wrapper_without_its_jar_runs_the_unpacked_distribution() {
|
||||
use crate::apply::gradle_command;
|
||||
let tmp = tempfile::tempdir().unwrap();
|
||||
let root = tmp.path();
|
||||
let plain = if cfg!(windows) { "gradle.bat" } else { "gradle" };
|
||||
let wrapper = root.join(if cfg!(windows) { "gradlew.bat" } else { "gradlew" });
|
||||
std::fs::write(&wrapper, "").unwrap();
|
||||
std::fs::create_dir_all(root.join("gradle/wrapper")).unwrap();
|
||||
std::fs::write(
|
||||
root.join("gradle/wrapper/gradle-wrapper.properties"),
|
||||
"distributionUrl=https\\://services.gradle.org/distributions/gradle-4.10-bin.zip\n",
|
||||
)
|
||||
.unwrap();
|
||||
let mut settings = Settings::default();
|
||||
settings.languages.java.gradle.user_home = "user-home".into();
|
||||
let hash = root.join("user-home/wrapper/dists/gradle-4.10-bin/7ddd1b3f");
|
||||
let gradle = hash.join("gradle-4.10/bin").join(plain);
|
||||
std::fs::create_dir_all(gradle.parent().unwrap()).unwrap();
|
||||
std::fs::write(&gradle, "").unwrap();
|
||||
// Not marked complete: possibly half unpacked.
|
||||
assert_eq!(gradle_command(root, root, &settings), wrapper);
|
||||
std::fs::write(hash.join("gradle-4.10-bin.zip.ok"), "").unwrap();
|
||||
assert_eq!(gradle_command(root, root, &settings), gradle);
|
||||
// With its jar the wrapper runs as usual.
|
||||
std::fs::write(root.join("gradle/wrapper/gradle-wrapper.jar"), "").unwrap();
|
||||
assert_eq!(gradle_command(root, root, &settings), wrapper);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn gradle_settings_precedence() {
|
||||
use crate::apply::{gradle_command, gradle_env};
|
||||
|
||||
Reference in new issue
Block a user