From 646f0ba5890b23068768a8c7dea2d40b0b9b3296 Mon Sep 17 00:00:00 2001 From: Ross Smyth <18294397+RossSmyth@users.noreply.github.com> Date: Thu, 17 Apr 2025 14:45:37 -0400 Subject: [PATCH] Allow TYPST_PACKAGE_PATH to have a list of paths to search. This allows for better modularity with wrappers and such. --- crates/typst-cli/src/args.rs | 4 ++-- crates/typst-kit/src/package.rs | 16 +++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/crates/typst-cli/src/args.rs b/crates/typst-cli/src/args.rs index fd0eb5f05..daba06761 100644 --- a/crates/typst-cli/src/args.rs +++ b/crates/typst-cli/src/args.rs @@ -332,8 +332,8 @@ pub struct ProcessArgs { #[derive(Debug, Clone, Args)] pub struct PackageArgs { /// Custom path to local packages, defaults to system-dependent location. - #[clap(long = "package-path", env = "TYPST_PACKAGE_PATH", value_name = "DIR")] - pub package_path: Option, + #[clap(long = "package-path", env = "TYPST_PACKAGE_PATH", value_name = "DIR", value_delimiter = ENV_PATH_SEP)] + pub package_path: Option>, /// Custom path to package cache, defaults to system-dependent location. #[clap( diff --git a/crates/typst-kit/src/package.rs b/crates/typst-kit/src/package.rs index 584ec83c0..b09565890 100644 --- a/crates/typst-kit/src/package.rs +++ b/crates/typst-kit/src/package.rs @@ -28,7 +28,7 @@ pub struct PackageStorage { /// The path at which non-local packages should be stored when downloaded. package_cache_path: Option, /// The path at which local packages are stored. - package_path: Option, + package_path: Option>, /// The downloader used for fetching the index and packages. downloader: Downloader, /// The cached index of the default namespace. @@ -40,7 +40,7 @@ impl PackageStorage { /// the recommended XDG directories if they are `None`. pub fn new( package_cache_path: Option, - package_path: Option, + package_path: Option>, downloader: Downloader, ) -> Self { Self::with_index(package_cache_path, package_path, downloader, OnceCell::new()) @@ -51,7 +51,7 @@ impl PackageStorage { /// Useful for testing. fn with_index( package_cache_path: Option, - package_path: Option, + package_path: Option>, downloader: Downloader, index: OnceCell>, ) -> Self { @@ -60,7 +60,8 @@ impl PackageStorage { dirs::cache_dir().map(|cache_dir| cache_dir.join(DEFAULT_PACKAGES_SUBDIR)) }), package_path: package_path.or_else(|| { - dirs::data_dir().map(|data_dir| data_dir.join(DEFAULT_PACKAGES_SUBDIR)) + dirs::data_dir() + .map(|data_dir| vec![data_dir.join(DEFAULT_PACKAGES_SUBDIR)]) }), downloader, index, @@ -74,7 +75,7 @@ impl PackageStorage { } /// Returns the path at which local packages are stored. - pub fn package_path(&self) -> Option<&Path> { + pub fn package_path(&self) -> Option<&[PathBuf]> { self.package_path.as_deref() } @@ -87,8 +88,8 @@ impl PackageStorage { ) -> PackageResult { let subdir = format!("{}/{}/{}", spec.namespace, spec.name, spec.version); - if let Some(packages_dir) = &self.package_path { - let dir = packages_dir.join(&subdir); + for to_search in self.package_path.iter().flatten() { + let dir = to_search.join(&subdir); if dir.exists() { return Ok(dir); } @@ -134,6 +135,7 @@ impl PackageStorage { let subdir = format!("{}/{}", spec.namespace, spec.name); self.package_path .iter() + .flatten() .flat_map(|dir| std::fs::read_dir(dir.join(&subdir)).ok()) .flatten() .filter_map(|entry| entry.ok())