aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-24 01:00:48 +0900
committernsfisis <nsfisis@gmail.com>2026-02-24 01:00:48 +0900
commit64ed53cf184fb05cbfe9f0336bc8695ff0e800f8 (patch)
treecea8c1854c5c7bf0fcffcaf175f1bf188d9f8904
parentd9858fbd322ce20de84f44ce67ae11edf081578c (diff)
downloadphp-mozart-64ed53cf184fb05cbfe9f0336bc8695ff0e800f8.tar.gz
php-mozart-64ed53cf184fb05cbfe9f0336bc8695ff0e800f8.tar.zst
php-mozart-64ed53cf184fb05cbfe9f0336bc8695ff0e800f8.zip
fix(cache): enable dist archive caching for all commands
files_cache was Option<&Cache> and install_from_lock always passed None, so downloaded zip/tar archives were never cached. Make the parameter non-optional (&Cache) and wire it through every command that downloads dist archives (install, update, require, remove, create-project, archive). The Cache internally respects --no-cache via its enabled flag, so the Option wrapper was unnecessary. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
-rw-r--r--crates/mozart-registry/src/downloader.rs18
-rw-r--r--crates/mozart/src/commands/archive.rs21
-rw-r--r--crates/mozart/src/commands/create_project.rs12
-rw-r--r--crates/mozart/src/commands/install.rs9
-rw-r--r--crates/mozart/src/commands/reinstall.rs2
-rw-r--r--crates/mozart/src/commands/remove.rs5
-rw-r--r--crates/mozart/src/commands/require.rs1
-rw-r--r--crates/mozart/src/commands/status.rs2
-rw-r--r--crates/mozart/src/commands/update.rs1
9 files changed, 49 insertions, 22 deletions
diff --git a/crates/mozart-registry/src/downloader.rs b/crates/mozart-registry/src/downloader.rs
index 6660188..5431360 100644
--- a/crates/mozart-registry/src/downloader.rs
+++ b/crates/mozart-registry/src/downloader.rs
@@ -77,22 +77,20 @@ impl DownloadProgress {
/// If `expected_shasum` is provided and non-empty, verifies SHA-1 of the downloaded bytes.
/// If `progress` is provided, increments it as bytes are received and sets the total from
/// the `Content-Length` response header.
-/// If `files_cache` is provided, the downloaded bytes are cached by URL; cache hits skip
-/// the network request entirely.
+/// Downloaded bytes are cached by URL in `files_cache`; cache hits skip the network request
+/// entirely.
#[tracing::instrument(skip(expected_shasum, progress, files_cache))]
pub async fn download_dist(
url: &str,
expected_shasum: Option<&str>,
progress: Option<&mut DownloadProgress>,
- files_cache: Option<&Cache>,
+ files_cache: &Cache,
) -> anyhow::Result<Vec<u8>> {
// Build a cache key from the URL
let cache_key = Cache::sanitize_key(url);
// Check cache first
- if let Some(cache) = files_cache
- && let Some(cached_bytes) = cache.read_bytes(&cache_key)
- {
+ if let Some(cached_bytes) = files_cache.read_bytes(&cache_key) {
// Verify checksum against cache hit if provided
if let Some(shasum) = expected_shasum
&& !shasum.is_empty()
@@ -158,9 +156,7 @@ pub async fn download_dist(
}
// Write to cache
- if let Some(cache) = files_cache {
- let _ = cache.write_bytes(&cache_key, &bytes);
- }
+ let _ = files_cache.write_bytes(&cache_key, &bytes);
Ok(bytes)
}
@@ -328,7 +324,7 @@ pub fn extract_tar_gz(data: &[u8], target_dir: &Path) -> anyhow::Result<()> {
/// - `vendor_dir`: path to `vendor/` directory
/// - `package_name`: e.g. `"monolog/monolog"`
/// - `progress`: optional mutable progress tracker to update during download
-/// - `files_cache`: optional files cache; if provided, the archive bytes are cached by URL
+/// - `files_cache`: files cache; archive bytes are cached by URL
pub async fn install_package(
dist_url: &str,
dist_type: &str,
@@ -336,7 +332,7 @@ pub async fn install_package(
vendor_dir: &Path,
package_name: &str,
progress: Option<&mut DownloadProgress>,
- files_cache: Option<&Cache>,
+ files_cache: &Cache,
) -> anyhow::Result<()> {
let target = vendor_dir.join(package_name);
diff --git a/crates/mozart/src/commands/archive.rs b/crates/mozart/src/commands/archive.rs
index 2490246..faa0e94 100644
--- a/crates/mozart/src/commands/archive.rs
+++ b/crates/mozart/src/commands/archive.rs
@@ -96,6 +96,7 @@ pub async fn execute(
let cache_config = mozart_registry::cache::build_cache_config(cli.no_cache);
let repo_cache = mozart_registry::cache::Cache::repo(&cache_config);
+ let files_cache = mozart_registry::cache::Cache::files(&cache_config);
// 1. Determine working directory
let working_dir = match &cli.working_dir {
@@ -153,7 +154,14 @@ pub async fn execute(
let meta: PackageMeta = if let Some(ref pkg_name) = args.package {
// Remote package mode
console.info("Searching for the specified package.");
- resolve_remote_package(pkg_name, args.version.as_deref(), &repo_cache, console).await?
+ resolve_remote_package(
+ pkg_name,
+ args.version.as_deref(),
+ &repo_cache,
+ &files_cache,
+ console,
+ )
+ .await?
} else {
// Root package mode
if !composer_json_path.exists() {
@@ -248,6 +256,7 @@ async fn resolve_remote_package(
package_name: &str,
version_constraint: Option<&str>,
repo_cache: &mozart_registry::cache::Cache,
+ files_cache: &mozart_registry::cache::Cache,
console: &mozart_core::console::Console,
) -> anyhow::Result<PackageMeta> {
use mozart_core::package::Stability;
@@ -334,9 +343,13 @@ async fn resolve_remote_package(
let temp_dir = temp_base.join(&unique);
std::fs::create_dir_all(&temp_dir)?;
- let bytes =
- mozart_registry::downloader::download_dist(&dist.url, dist.shasum.as_deref(), None, None)
- .await?;
+ let bytes = mozart_registry::downloader::download_dist(
+ &dist.url,
+ dist.shasum.as_deref(),
+ None,
+ files_cache,
+ )
+ .await?;
match dist.dist_type.as_str() {
"zip" => mozart_registry::downloader::extract_zip(&bytes, &temp_dir)?,
diff --git a/crates/mozart/src/commands/create_project.rs b/crates/mozart/src/commands/create_project.rs
index 63d8a1a..a137868 100644
--- a/crates/mozart/src/commands/create_project.rs
+++ b/crates/mozart/src/commands/create_project.rs
@@ -274,6 +274,7 @@ pub async fn execute(
let cache_config = mozart_registry::cache::build_cache_config(cli.no_cache);
let repo_cache = mozart_registry::cache::Cache::repo(&cache_config);
+ let files_cache = mozart_registry::cache::Cache::files(&cache_config);
let versions = packagist::fetch_package_versions(&package_name, &repo_cache).await?;
@@ -326,9 +327,13 @@ pub async fn execute(
format!("{package_name} ({concrete_version})"),
);
- let bytes =
- downloader::download_dist(&dist.url, dist.shasum.as_deref(), Some(&mut progress), None)
- .await?;
+ let bytes = downloader::download_dist(
+ &dist.url,
+ dist.shasum.as_deref(),
+ Some(&mut progress),
+ &files_cache,
+ )
+ .await?;
progress.finish();
@@ -509,6 +514,7 @@ pub async fn execute(
apcu_autoloader_prefix: None,
download_only: false,
prefer_source: args.prefer_source,
+ no_cache: cli.no_cache,
},
console,
)
diff --git a/crates/mozart/src/commands/install.rs b/crates/mozart/src/commands/install.rs
index 6eedd05..477253c 100644
--- a/crates/mozart/src/commands/install.rs
+++ b/crates/mozart/src/commands/install.rs
@@ -119,6 +119,8 @@ pub struct InstallConfig {
pub download_only: bool,
/// Prefer installing from VCS source rather than dist archives.
pub prefer_source: bool,
+ /// Disable the files cache entirely.
+ pub no_cache: bool,
}
impl Default for InstallConfig {
@@ -136,6 +138,7 @@ impl Default for InstallConfig {
apcu_autoloader_prefix: None,
download_only: false,
prefer_source: false,
+ no_cache: false,
}
}
}
@@ -356,6 +359,9 @@ pub async fn install_from_lock(
config: &InstallConfig,
console: &mozart_core::console::Console,
) -> anyhow::Result<()> {
+ let cache_config = mozart_registry::cache::build_cache_config(config.no_cache);
+ let files_cache = mozart_registry::cache::Cache::files(&cache_config);
+
let dev_mode = config.dev_mode;
// Step 1: Determine which packages to install
@@ -492,7 +498,7 @@ pub async fn install_from_lock(
vendor_dir,
&pkg.name,
Some(&mut progress),
- None,
+ &files_cache,
)
.await?;
@@ -697,6 +703,7 @@ pub async fn execute(
apcu_autoloader_prefix: args.apcu_autoloader_prefix.clone(),
download_only: args.download_only,
prefer_source,
+ no_cache: cli.no_cache,
},
console,
)
diff --git a/crates/mozart/src/commands/reinstall.rs b/crates/mozart/src/commands/reinstall.rs
index abc207f..875d5f0 100644
--- a/crates/mozart/src/commands/reinstall.rs
+++ b/crates/mozart/src/commands/reinstall.rs
@@ -239,7 +239,7 @@ pub async fn execute(
&vendor_dir,
&locked.name,
Some(&mut progress),
- Some(&files_cache),
+ &files_cache,
)
.await?;
diff --git a/crates/mozart/src/commands/remove.rs b/crates/mozart/src/commands/remove.rs
index d489466..7afa51d 100644
--- a/crates/mozart/src/commands/remove.rs
+++ b/crates/mozart/src/commands/remove.rs
@@ -135,7 +135,7 @@ pub async fn execute(
// When --unused is set with no explicit packages, we re-resolve to detect
// packages in the lock file that are no longer reachable from root requirements.
if args.unused && args.packages.is_empty() {
- return remove_unused(&raw, &working_dir, args, &repo_cache, console).await;
+ return remove_unused(&raw, &working_dir, args, &repo_cache, cli.no_cache, console).await;
}
// Step 5: Determine which packages to remove and remove them
@@ -444,6 +444,7 @@ pub async fn execute(
apcu_autoloader_prefix: args.apcu_autoloader_prefix.clone(),
download_only: false,
prefer_source: false,
+ no_cache: cli.no_cache,
},
console,
)
@@ -459,6 +460,7 @@ async fn remove_unused(
working_dir: &std::path::Path,
args: &RemoveArgs,
repo_cache: &mozart_registry::cache::Cache,
+ no_cache: bool,
console: &mozart_core::console::Console,
) -> anyhow::Result<()> {
let lock_path = working_dir.join("composer.lock");
@@ -587,6 +589,7 @@ async fn remove_unused(
apcu_autoloader_prefix: args.apcu_autoloader_prefix.clone(),
download_only: false,
prefer_source: false,
+ no_cache,
},
console,
)
diff --git a/crates/mozart/src/commands/require.rs b/crates/mozart/src/commands/require.rs
index 5f02f5f..016a536 100644
--- a/crates/mozart/src/commands/require.rs
+++ b/crates/mozart/src/commands/require.rs
@@ -864,6 +864,7 @@ pub async fn execute(
apcu_autoloader_prefix: args.apcu_autoloader_prefix.clone(),
download_only: false,
prefer_source: args.prefer_source,
+ no_cache: cli.no_cache,
},
console,
)
diff --git a/crates/mozart/src/commands/status.rs b/crates/mozart/src/commands/status.rs
index 7cefe96..6d8fc98 100644
--- a/crates/mozart/src/commands/status.rs
+++ b/crates/mozart/src/commands/status.rs
@@ -116,7 +116,7 @@ pub async fn execute(
&dist.url,
dist.shasum.as_deref(),
None,
- Some(&files_cache),
+ &files_cache,
)
.await;
diff --git a/crates/mozart/src/commands/update.rs b/crates/mozart/src/commands/update.rs
index 9f47794..da2fd95 100644
--- a/crates/mozart/src/commands/update.rs
+++ b/crates/mozart/src/commands/update.rs
@@ -1221,6 +1221,7 @@ pub async fn execute(
apcu_autoloader_prefix: args.apcu_autoloader_prefix.clone(),
download_only: false,
prefer_source,
+ no_cache: cli.no_cache,
},
console,
)