use super::{BloatDir, EnforcePolicy, PackageManager, dir_size};
use anyhow::{Result, anyhow};
use std::path::Path;
const GRADLE_MANIFESTS: [&str; 4] = [
"build.gradle",
"build.gradle.kts",
"settings.gradle",
"settings.gradle.kts",
];
pub struct Gradle;
fn has_manifest(path: &Path) -> bool {
GRADLE_MANIFESTS.iter().any(|m| path.join(m).exists())
}
impl PackageManager for Gradle {
fn name(&self) -> &'static str {
"gradle"
}
fn detect(&self, path: &Path) -> bool {
has_manifest(path)
}
fn bloat_dirs(&self, path: &Path) -> Vec<BloatDir> {
let mut dirs = Vec::new();
for name in ["build", ".gradle"] {
let dir = path.join(name);
if dir.is_dir() {
dirs.push(BloatDir {
name: name.to_string(),
path: dir.clone(),
size_bytes: dir_size(&dir),
shared_bytes: 0,
});
}
}
dirs
}
fn enforce_lockfile(&self, path: &Path, _policy: EnforcePolicy) -> Result<()> {
if !has_manifest(path) {
return Err(anyhow!(
"no Gradle manifest (build.gradle[.kts] / settings.gradle[.kts]) — \
nothing to rebuild `build/` from."
));
}
Ok(())
}
fn restore(&self, path: &Path, _timeout: std::time::Duration) -> Result<()> {
let wrapper = if cfg!(windows) {
"gradlew.bat"
} else {
"gradlew"
};
let cmd = if path.join(wrapper).exists() {
"./gradlew build"
} else {
"gradle build"
};
println!("Gradle build/ will regenerate on the next `{cmd}`");
Ok(())
}
fn opt_in(&self) -> bool {
true
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
use tempfile::tempdir;
#[test]
fn detects_on_any_gradle_manifest() {
let dir = tempdir().unwrap();
assert!(!Gradle.detect(dir.path()));
fs::write(dir.path().join("build.gradle.kts"), "").unwrap();
assert!(Gradle.detect(dir.path()));
}
#[test]
fn claims_build_and_project_local_gradle_dir() {
let dir = tempdir().unwrap();
fs::create_dir(dir.path().join("build")).unwrap();
fs::create_dir(dir.path().join(".gradle")).unwrap();
let names: Vec<String> = Gradle
.bloat_dirs(dir.path())
.into_iter()
.map(|b| b.name)
.collect();
assert_eq!(names, vec!["build", ".gradle"]);
}
#[test]
fn a_vanished_manifest_is_refused() {
let dir = tempdir().unwrap();
assert!(
Gradle
.enforce_lockfile(dir.path(), EnforcePolicy::default())
.is_err()
);
fs::write(dir.path().join("settings.gradle"), "").unwrap();
assert!(
Gradle
.enforce_lockfile(dir.path(), EnforcePolicy::default())
.is_ok()
);
}
#[test]
fn gradle_is_opt_in() {
assert!(Gradle.opt_in());
}
}