aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/repository')
-rw-r--r--crates/shirabe/src/repository/array_repository.rs6
-rw-r--r--crates/shirabe/src/repository/artifact_repository.rs4
-rw-r--r--crates/shirabe/src/repository/composer_repository.rs35
-rw-r--r--crates/shirabe/src/repository/composite_repository.rs6
-rw-r--r--crates/shirabe/src/repository/filesystem_repository.rs27
-rw-r--r--crates/shirabe/src/repository/filter_repository.rs10
-rw-r--r--crates/shirabe/src/repository/handle.rs4
-rw-r--r--crates/shirabe/src/repository/installed_array_repository.rs10
-rw-r--r--crates/shirabe/src/repository/installed_filesystem_repository.rs10
-rw-r--r--crates/shirabe/src/repository/installed_repository.rs14
-rw-r--r--crates/shirabe/src/repository/lock_array_repository.rs4
-rw-r--r--crates/shirabe/src/repository/package_repository.rs15
-rw-r--r--crates/shirabe/src/repository/path_repository.rs4
-rw-r--r--crates/shirabe/src/repository/platform_repository.rs25
-rw-r--r--crates/shirabe/src/repository/repository_factory.rs2
-rw-r--r--crates/shirabe/src/repository/repository_interface.rs5
-rw-r--r--crates/shirabe/src/repository/root_package_repository.rs4
-rw-r--r--crates/shirabe/src/repository/vcs_repository.rs4
-rw-r--r--crates/shirabe/src/repository/writable_array_repository.rs24
-rw-r--r--crates/shirabe/src/repository/writable_repository_interface.rs2
20 files changed, 133 insertions, 82 deletions
diff --git a/crates/shirabe/src/repository/array_repository.rs b/crates/shirabe/src/repository/array_repository.rs
index 30598b62..c05434fc 100644
--- a/crates/shirabe/src/repository/array_repository.rs
+++ b/crates/shirabe/src/repository/array_repository.rs
@@ -231,13 +231,13 @@ impl RepositoryInterface for ArrayRepository {
Ok(self.base_count())
}
- fn get_repo_name(&self) -> String {
+ fn get_repo_name(&self) -> anyhow::Result<String> {
let count = self.base_count();
- format!(
+ Ok(format!(
"array repo (defining {} package{})",
count,
if count > 1 { "s" } else { "" },
- )
+ ))
}
fn load_packages(
diff --git a/crates/shirabe/src/repository/artifact_repository.rs b/crates/shirabe/src/repository/artifact_repository.rs
index f18f7f04..99f340d1 100644
--- a/crates/shirabe/src/repository/artifact_repository.rs
+++ b/crates/shirabe/src/repository/artifact_repository.rs
@@ -314,8 +314,8 @@ impl RepositoryInterface for ArtifactRepository {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
- ArtifactRepository::get_repo_name(self)
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(ArtifactRepository::get_repo_name(self))
}
fn as_any(&self) -> &dyn std::any::Any {
diff --git a/crates/shirabe/src/repository/composer_repository.rs b/crates/shirabe/src/repository/composer_repository.rs
index 18de557b..c83ffcd9 100644
--- a/crates/shirabe/src/repository/composer_repository.rs
+++ b/crates/shirabe/src/repository/composer_repository.rs
@@ -1651,15 +1651,20 @@ impl ComposerRepository {
Url::sanitize(self.get_packages_json_url())
);
for package in self.create_packages(repo_data, Some(source))? {
- self.add_package(package);
+ self.add_package(package)?;
}
Ok(())
}
/// Adds a new package to the repository
- pub fn add_package(&mut self, package: BasePackageHandle) {
+ pub fn add_package(&mut self, package: BasePackageHandle) -> anyhow::Result<()> {
self.configure_package_transport_options(package.clone());
- self.inner.add_package(package);
+ // PHP: ArrayRepository::addPackage() calls the late-bound $this->initialize(), which
+ // resolves to ComposerRepository::initialize (loading the root file).
+ if !self.inner.is_initialized() {
+ self.initialize()?;
+ }
+ self.inner.add_package(package)
}
/// Forwards the outermost handle's weak to the inner `ArrayRepository` so that packages added
@@ -3425,11 +3430,25 @@ impl RepositoryInterface for ComposerRepository {
self.inner.count()
}
+ // PHP's ArrayRepository::hasPackage() builds its packageMap from the late-bound
+ // $this->getPackages(), which resolves to ComposerRepository::getPackages() — throwing a
+ // LogicException on lazy/provider repos and loading everything on available-packages repos.
fn has_package(&mut self, package: PackageInterfaceHandle) -> anyhow::Result<bool> {
- if !self.inner.is_initialized() {
- self.initialize()?;
+ if self.inner.package_map.borrow().is_none() {
+ let mut map: IndexMap<String, BasePackageHandle> = IndexMap::new();
+ for repo_package in ComposerRepository::get_packages(self)? {
+ map.insert(repo_package.get_unique_name(), repo_package);
+ }
+ *self.inner.package_map.borrow_mut() = Some(map);
}
- self.inner.has_package(package)
+
+ Ok(self
+ .inner
+ .package_map
+ .borrow()
+ .as_ref()
+ .unwrap()
+ .contains_key(&package.get_unique_name()))
}
/// @inheritDoc
@@ -3671,8 +3690,8 @@ impl RepositoryInterface for ComposerRepository {
.collect())
}
- fn get_repo_name(&self) -> String {
- ComposerRepository::get_repo_name(self)
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(ComposerRepository::get_repo_name(self))
}
fn as_advisory_provider(&self) -> Option<&dyn crate::repository::AdvisoryProviderInterface> {
diff --git a/crates/shirabe/src/repository/composite_repository.rs b/crates/shirabe/src/repository/composite_repository.rs
index a9c55a0f..6973ccda 100644
--- a/crates/shirabe/src/repository/composite_repository.rs
+++ b/crates/shirabe/src/repository/composite_repository.rs
@@ -69,13 +69,13 @@ impl RepositoryInterface for CompositeRepository {
Ok(total)
}
- fn get_repo_name(&self) -> String {
+ fn get_repo_name(&self) -> anyhow::Result<String> {
let names: Vec<String> = self
.repositories
.iter()
.map(|r| r.get_repo_name())
- .collect();
- format!("composite repo ({})", names.join(", "))
+ .collect::<anyhow::Result<_>>()?;
+ Ok(format!("composite repo ({})", names.join(", ")))
}
fn has_package(&mut self, package: PackageInterfaceHandle) -> anyhow::Result<bool> {
diff --git a/crates/shirabe/src/repository/filesystem_repository.rs b/crates/shirabe/src/repository/filesystem_repository.rs
index 88317be2..151cf2d3 100644
--- a/crates/shirabe/src/repository/filesystem_repository.rs
+++ b/crates/shirabe/src/repository/filesystem_repository.rs
@@ -38,7 +38,9 @@ pub struct FilesystemRepository {
/// @var Filesystem
filesystem: std::rc::Rc<std::cell::RefCell<Filesystem>>,
/// @var bool|null
- dev_mode: Option<bool>,
+ // Cell so that initialize() can stay `&self` (late-bound initialization out of shared
+ // contexts such as getRepoName).
+ dev_mode: std::cell::Cell<Option<bool>>,
}
impl FilesystemRepository {
@@ -67,24 +69,27 @@ impl FilesystemRepository {
dump_versions,
root_package,
filesystem,
- dev_mode: None,
+ dev_mode: std::cell::Cell::new(None),
})
}
/// @return bool|null true if dev requirements were installed, false if --no-dev was used, null if yet unknown
pub fn get_dev_mode(&self) -> Option<bool> {
- self.dev_mode
+ self.dev_mode.get()
}
pub fn set_self_handle(&self, weak: crate::repository::RepositoryInterfaceWeakHandle) {
self.inner.set_self_handle(weak);
}
- pub fn get_repo_name(&self) -> String {
+ pub fn get_repo_name(&self) -> anyhow::Result<String> {
+ // PHP: ArrayRepository::getRepoName() counts through the late-bound $this->initialize(),
+ // which resolves to FilesystemRepository::initialize (reading the file).
+ self.ensure_initialized()?;
self.inner.get_repo_name()
}
- fn ensure_initialized(&mut self) -> anyhow::Result<()> {
+ fn ensure_initialized(&self) -> anyhow::Result<()> {
if !self.inner.is_initialized() {
self.initialize()?;
}
@@ -92,7 +97,7 @@ impl FilesystemRepository {
}
/// Initializes repository (reads file, or remote address).
- pub(crate) fn initialize(&mut self) -> anyhow::Result<()> {
+ pub(crate) fn initialize(&self) -> anyhow::Result<()> {
self.inner.initialize();
if !self.file.exists() {
@@ -124,7 +129,7 @@ impl FilesystemRepository {
self.inner.set_dev_package_names(dev_names);
}
if let Some(dev) = m.get("dev") {
- self.dev_mode = dev.as_bool();
+ self.dev_mode.set(dev.as_bool());
}
}
@@ -203,7 +208,7 @@ impl FilesystemRepository {
self.inner.set_dev_package_names(dev_package_names);
}
- pub fn get_dev_package_names(&self) -> &Vec<String> {
+ pub fn get_dev_package_names(&self) -> Vec<String> {
self.inner.get_dev_package_names()
}
@@ -281,6 +286,7 @@ impl FilesystemRepository {
&PhpMixed::List(
self.inner
.dev_package_names
+ .borrow()
.iter()
.map(|s| PhpMixed::String(s.clone()))
.collect(),
@@ -436,6 +442,7 @@ impl FilesystemRepository {
let dev_packages = array_flip(&PhpMixed::List(
self.inner
.dev_package_names
+ .borrow()
.iter()
.map(|s| PhpMixed::String(s.clone()))
.collect(),
@@ -793,8 +800,8 @@ impl RepositoryInterface for FilesystemRepository {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
- self.inner.get_repo_name()
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ FilesystemRepository::get_repo_name(self)
}
fn as_any(&self) -> &dyn std::any::Any {
diff --git a/crates/shirabe/src/repository/filter_repository.rs b/crates/shirabe/src/repository/filter_repository.rs
index 32a32ba1..d7be0a9f 100644
--- a/crates/shirabe/src/repository/filter_repository.rs
+++ b/crates/shirabe/src/repository/filter_repository.rs
@@ -52,7 +52,7 @@ impl FilterRepository {
return Err(InvalidArgumentException {
message: format!(
r#""only" key for repository {} should be an array"#,
- repo.get_repo_name()
+ repo.get_repo_name()?
),
code: 0,
}
@@ -82,7 +82,7 @@ impl FilterRepository {
return Err(InvalidArgumentException {
message: format!(
r#""exclude" key for repository {} should be an array"#,
- repo.get_repo_name()
+ repo.get_repo_name()?
),
code: 0,
}
@@ -94,7 +94,7 @@ impl FilterRepository {
return Err(InvalidArgumentException {
message: format!(
r#"Only one of "only" and "exclude" can be specified for repository {}"#,
- repo.get_repo_name()
+ repo.get_repo_name()?
),
code: 0,
}
@@ -109,7 +109,7 @@ impl FilterRepository {
return Err(InvalidArgumentException {
message: format!(
r#""canonical" key for repository {} should be a boolean"#,
- repo.get_repo_name()
+ repo.get_repo_name()?
),
code: 0,
}
@@ -260,7 +260,7 @@ impl RepositoryInterface for FilterRepository {
Ok(result)
}
- fn get_repo_name(&self) -> String {
+ fn get_repo_name(&self) -> anyhow::Result<String> {
self.repo.get_repo_name()
}
diff --git a/crates/shirabe/src/repository/handle.rs b/crates/shirabe/src/repository/handle.rs
index 497e2b91..2a7239b9 100644
--- a/crates/shirabe/src/repository/handle.rs
+++ b/crates/shirabe/src/repository/handle.rs
@@ -87,7 +87,7 @@ impl RepositoryInterfaceHandle {
self.0.borrow_mut().count()
}
- pub fn get_repo_name(&self) -> String {
+ pub fn get_repo_name(&self) -> anyhow::Result<String> {
self.0.borrow().get_repo_name()
}
@@ -181,7 +181,7 @@ impl RepositoryInterfaceHandle {
self.0
.borrow()
.as_installed_repository_interface()
- .map(|r| r.get_dev_package_names().clone())
+ .map(|r| r.get_dev_package_names())
.unwrap_or_default()
}
diff --git a/crates/shirabe/src/repository/installed_array_repository.rs b/crates/shirabe/src/repository/installed_array_repository.rs
index b458ff61..c0c0fbb7 100644
--- a/crates/shirabe/src/repository/installed_array_repository.rs
+++ b/crates/shirabe/src/repository/installed_array_repository.rs
@@ -28,8 +28,8 @@ impl InstalledArrayRepository {
})
}
- pub fn get_repo_name(&self) -> String {
- format!("installed {}", self.inner.get_repo_name())
+ pub fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(format!("installed {}", self.inner.get_repo_name()?))
}
}
@@ -73,7 +73,7 @@ impl WritableRepositoryInterface for InstalledArrayRepository {
self.inner.set_dev_package_names(dev_package_names);
}
- fn get_dev_package_names(&self) -> &Vec<String> {
+ fn get_dev_package_names(&self) -> Vec<String> {
self.inner.get_dev_package_names()
}
}
@@ -131,8 +131,8 @@ impl RepositoryInterface for InstalledArrayRepository {
) -> anyhow::Result<IndexMap<String, ProviderInfo>> {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
- format!("installed {}", self.inner.get_repo_name())
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(format!("installed {}", self.inner.get_repo_name()?))
}
fn as_advisory_provider(&self) -> Option<&dyn AdvisoryProviderInterface> {
None
diff --git a/crates/shirabe/src/repository/installed_filesystem_repository.rs b/crates/shirabe/src/repository/installed_filesystem_repository.rs
index 85fb514b..0bb962fd 100644
--- a/crates/shirabe/src/repository/installed_filesystem_repository.rs
+++ b/crates/shirabe/src/repository/installed_filesystem_repository.rs
@@ -55,8 +55,8 @@ impl InstalledFilesystemRepository {
})
}
- pub fn get_repo_name(&self) -> String {
- format!("installed {}", self.inner.get_repo_name())
+ pub fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(format!("installed {}", self.inner.get_repo_name()?))
}
}
@@ -107,7 +107,7 @@ impl WritableRepositoryInterface for InstalledFilesystemRepository {
self.inner.set_dev_package_names(dev_package_names);
}
- fn get_dev_package_names(&self) -> &Vec<String> {
+ fn get_dev_package_names(&self) -> Vec<String> {
self.inner.get_dev_package_names()
}
}
@@ -165,8 +165,8 @@ impl RepositoryInterface for InstalledFilesystemRepository {
) -> anyhow::Result<IndexMap<String, ProviderInfo>> {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
- format!("installed {}", self.inner.get_repo_name())
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(format!("installed {}", self.inner.get_repo_name()?))
}
fn as_advisory_provider(&self) -> Option<&dyn AdvisoryProviderInterface> {
None
diff --git a/crates/shirabe/src/repository/installed_repository.rs b/crates/shirabe/src/repository/installed_repository.rs
index 08b1f36b..36ad510c 100644
--- a/crates/shirabe/src/repository/installed_repository.rs
+++ b/crates/shirabe/src/repository/installed_repository.rs
@@ -367,8 +367,12 @@ impl InstalledRepository {
|| repository.is::<RootPackageRepository>()
|| repository.is::<PlatformRepository>(),
"An InstalledRepository can not contain a repository of type {} ({})",
- repository.get_repo_name(),
- repository.get_repo_name()
+ repository
+ .get_repo_name()
+ .expect("getRepoName failed while reporting an invalid repository"),
+ repository
+ .get_repo_name()
+ .expect("getRepoName failed while reporting an invalid repository")
);
self.inner.add_repository(repository);
@@ -380,14 +384,14 @@ impl RepositoryInterface for InstalledRepository {
self.inner.count()
}
- fn get_repo_name(&self) -> String {
+ fn get_repo_name(&self) -> anyhow::Result<String> {
let names: Vec<String> = self
.inner
.get_repositories()
.iter()
.map(|repo| repo.get_repo_name())
- .collect();
- format!("installed repo ({})", names.join(", "))
+ .collect::<anyhow::Result<_>>()?;
+ Ok(format!("installed repo ({})", names.join(", ")))
}
fn has_package(&mut self, package: PackageInterfaceHandle) -> anyhow::Result<bool> {
diff --git a/crates/shirabe/src/repository/lock_array_repository.rs b/crates/shirabe/src/repository/lock_array_repository.rs
index 8b909fbc..9ae311da 100644
--- a/crates/shirabe/src/repository/lock_array_repository.rs
+++ b/crates/shirabe/src/repository/lock_array_repository.rs
@@ -90,8 +90,8 @@ impl RepositoryInterface for LockArrayRepository {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
- "lock repo".to_string()
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok("lock repo".to_string())
}
fn as_any(&self) -> &dyn std::any::Any {
diff --git a/crates/shirabe/src/repository/package_repository.rs b/crates/shirabe/src/repository/package_repository.rs
index 06b28451..62c8c5b3 100644
--- a/crates/shirabe/src/repository/package_repository.rs
+++ b/crates/shirabe/src/repository/package_repository.rs
@@ -83,13 +83,16 @@ impl PackageRepository {
Ok(Ok(()))
}
- pub fn get_repo_name(&self) -> String {
+ pub fn get_repo_name(&self) -> anyhow::Result<String> {
use crate::repository::RepositoryInterface;
- Preg::replace(
+ // PHP: parent::getRepoName() counts through the late-bound $this->initialize(),
+ // which resolves to PackageRepository::initialize (loading the config packages).
+ self.ensure_initialized()?;
+ Ok(Preg::replace(
php_regex!(r"{^array }"),
"package ",
- &self.inner.get_repo_name(),
- )
+ &self.inner.get_repo_name()?,
+ ))
}
// In PHP the inherited ArrayRepository methods lazily call the overridden initialize() to load
@@ -175,7 +178,7 @@ impl RepositoryInterface for PackageRepository {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
+ fn get_repo_name(&self) -> anyhow::Result<String> {
PackageRepository::get_repo_name(self)
}
@@ -235,7 +238,7 @@ impl AdvisoryProviderInterface for PackageRepository {
message: format!(
"Advisory for {} could not be loaded as a full advisory from {}\n{}",
package_name,
- self.get_repo_name(),
+ self.get_repo_name()?,
var_export(data, true)
),
code: 0,
diff --git a/crates/shirabe/src/repository/path_repository.rs b/crates/shirabe/src/repository/path_repository.rs
index 879b769c..ec2da043 100644
--- a/crates/shirabe/src/repository/path_repository.rs
+++ b/crates/shirabe/src/repository/path_repository.rs
@@ -464,8 +464,8 @@ impl RepositoryInterface for PathRepository {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
- PathRepository::get_repo_name(self)
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(PathRepository::get_repo_name(self))
}
fn as_any(&self) -> &dyn std::any::Any {
diff --git a/crates/shirabe/src/repository/platform_repository.rs b/crates/shirabe/src/repository/platform_repository.rs
index 30164237..f0d8b46e 100644
--- a/crates/shirabe/src/repository/platform_repository.rs
+++ b/crates/shirabe/src/repository/platform_repository.rs
@@ -100,14 +100,20 @@ impl PlatformRepository {
},
);
}
- Ok(Self {
- inner: ArrayRepository::new(packages)?,
+ // PHP: parent::__construct($packages) runs after the overrides are set, and the parent
+ // ctor's $this->addPackage() calls late-bind to PlatformRepository::addPackage.
+ let mut this = Self {
+ inner: ArrayRepository::new(vec![])?,
version_parser: None,
overrides: overrides_map,
disabled_packages: IndexMap::new(),
runtime,
hhvm_detector,
- })
+ };
+ for package in packages {
+ this.add_package(package)?;
+ }
+ Ok(this)
}
pub fn get_repo_name(&self) -> String {
@@ -1541,6 +1547,9 @@ impl PlatformRepository {
return Ok(());
}
+ // PHP: $this->findPackage() reaches ArrayRepository::findPackage, whose
+ // getPackages() call late-binds to PlatformRepository::initialize.
+ self.ensure_initialized()?;
let overrider = self.inner.find_package(
&name,
crate::repository::FindPackageConstraint::String("*".to_string()),
@@ -1583,7 +1592,9 @@ impl PlatformRepository {
return Ok(());
}
- self.inner.add_package(package);
+ // PHP: parent::addPackage() calls the late-bound $this->initialize() before pushing.
+ self.ensure_initialized()?;
+ self.inner.add_package(package)?;
Ok(())
}
@@ -1611,6 +1622,8 @@ impl PlatformRepository {
extra.insert("config.platform".to_string(), PhpMixed::Bool(true));
package.inner.set_extra(extra);
let package = CompletePackageHandle::from_complete_package(package);
+ // PHP: parent::addPackage() calls the late-bound $this->initialize() before pushing.
+ self.ensure_initialized()?;
self.inner.add_package(package.clone().into())?;
if package.get_name() == "php" {
@@ -1934,8 +1947,8 @@ impl crate::repository::RepositoryInterface for PlatformRepository {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
- PlatformRepository::get_repo_name(self)
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(PlatformRepository::get_repo_name(self))
}
fn as_any(&self) -> &dyn std::any::Any {
diff --git a/crates/shirabe/src/repository/repository_factory.rs b/crates/shirabe/src/repository/repository_factory.rs
index 972a5161..856f58ad 100644
--- a/crates/shirabe/src/repository/repository_factory.rs
+++ b/crates/shirabe/src/repository/repository_factory.rs
@@ -40,7 +40,7 @@ impl RepositoryFactory {
.unwrap_or("");
if extension == "json" {
- let mut json = JsonFile::new(
+ let json = JsonFile::new(
repository.to_string(),
Some(std::rc::Rc::new(std::cell::RefCell::new(
Factory::create_http_downloader(io.clone(), config, IndexMap::new())?,
diff --git a/crates/shirabe/src/repository/repository_interface.rs b/crates/shirabe/src/repository/repository_interface.rs
index ab25242c..cece0d6f 100644
--- a/crates/shirabe/src/repository/repository_interface.rs
+++ b/crates/shirabe/src/repository/repository_interface.rs
@@ -94,7 +94,10 @@ pub trait RepositoryInterface: std::fmt::Debug {
package_name: String,
) -> anyhow::Result<IndexMap<String, ProviderInfo>>;
- fn get_repo_name(&self) -> String;
+ // PHP's getRepoName() can throw: ArrayRepository::getRepoName() counts through the
+ // late-bound $this->initialize(), which is fallible in subclasses that read files
+ // (FilesystemRepository, PackageRepository).
+ fn get_repo_name(&self) -> anyhow::Result<String>;
fn as_advisory_provider(&self) -> Option<&dyn AdvisoryProviderInterface> {
None
diff --git a/crates/shirabe/src/repository/root_package_repository.rs b/crates/shirabe/src/repository/root_package_repository.rs
index 7630f6c5..d077d245 100644
--- a/crates/shirabe/src/repository/root_package_repository.rs
+++ b/crates/shirabe/src/repository/root_package_repository.rs
@@ -85,8 +85,8 @@ impl RepositoryInterface for RootPackageRepository {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
- RootPackageRepository::get_repo_name(self)
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(RootPackageRepository::get_repo_name(self))
}
fn as_any(&self) -> &dyn std::any::Any {
diff --git a/crates/shirabe/src/repository/vcs_repository.rs b/crates/shirabe/src/repository/vcs_repository.rs
index 9b1b0d84..dd7b4b06 100644
--- a/crates/shirabe/src/repository/vcs_repository.rs
+++ b/crates/shirabe/src/repository/vcs_repository.rs
@@ -1120,8 +1120,8 @@ impl RepositoryInterface for VcsRepository {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
- VcsRepository::get_repo_name(self)
+ fn get_repo_name(&self) -> anyhow::Result<String> {
+ Ok(VcsRepository::get_repo_name(self))
}
fn as_any(&self) -> &dyn std::any::Any {
diff --git a/crates/shirabe/src/repository/writable_array_repository.rs b/crates/shirabe/src/repository/writable_array_repository.rs
index f5db2bd9..bd685652 100644
--- a/crates/shirabe/src/repository/writable_array_repository.rs
+++ b/crates/shirabe/src/repository/writable_array_repository.rs
@@ -13,7 +13,9 @@ use shirabe_semver::constraint::AnyConstraint;
#[derive(Debug)]
pub struct WritableArrayRepository {
inner: ArrayRepository,
- pub(crate) dev_package_names: Vec<String>,
+ // RefCell so that FilesystemRepository::initialize can stay `&self` (late-bound
+ // initialization out of shared contexts such as getRepoName).
+ pub(crate) dev_package_names: std::cell::RefCell<Vec<String>>,
dev_mode: Option<bool>,
}
@@ -21,7 +23,7 @@ impl WritableArrayRepository {
pub fn new(packages: Vec<crate::package::PackageInterfaceHandle>) -> anyhow::Result<Self> {
Ok(Self {
inner: ArrayRepository::new(packages)?,
- dev_package_names: Vec::new(),
+ dev_package_names: std::cell::RefCell::new(Vec::new()),
dev_mode: None,
})
}
@@ -36,12 +38,12 @@ impl WritableArrayRepository {
self.inner.base_count()
}
- pub fn set_dev_package_names(&mut self, dev_package_names: Vec<String>) {
- self.dev_package_names = dev_package_names;
+ pub fn set_dev_package_names(&self, dev_package_names: Vec<String>) {
+ *self.dev_package_names.borrow_mut() = dev_package_names;
}
- pub fn get_dev_package_names(&self) -> &Vec<String> {
- &self.dev_package_names
+ pub fn get_dev_package_names(&self) -> Vec<String> {
+ self.dev_package_names.borrow().clone()
}
pub fn write(
@@ -66,7 +68,7 @@ impl WritableArrayRepository {
}
pub fn add_package(
- &mut self,
+ &self,
package: crate::package::PackageInterfaceHandle,
) -> anyhow::Result<()> {
self.inner.add_package(package)
@@ -84,7 +86,7 @@ impl WritableArrayRepository {
Ok(())
}
- pub fn initialize(&mut self) -> anyhow::Result<()> {
+ pub fn initialize(&self) -> anyhow::Result<()> {
self.inner.initialize();
Ok(())
}
@@ -123,8 +125,8 @@ impl WritableArrayRepository {
self.inner.get_packages()
}
- pub fn get_repo_name(&self) -> String {
- self.inner.get_repo_name()
+ pub fn get_repo_name(&self) -> anyhow::Result<String> {
+ RepositoryInterface::get_repo_name(&self.inner)
}
}
@@ -188,7 +190,7 @@ impl RepositoryInterface for WritableArrayRepository {
self.inner.get_providers(package_name)
}
- fn get_repo_name(&self) -> String {
+ fn get_repo_name(&self) -> anyhow::Result<String> {
self.inner.get_repo_name()
}
diff --git a/crates/shirabe/src/repository/writable_repository_interface.rs b/crates/shirabe/src/repository/writable_repository_interface.rs
index 75b21e9a..d7b35066 100644
--- a/crates/shirabe/src/repository/writable_repository_interface.rs
+++ b/crates/shirabe/src/repository/writable_repository_interface.rs
@@ -21,5 +21,5 @@ pub trait WritableRepositoryInterface: RepositoryInterface {
fn set_dev_package_names(&mut self, dev_package_names: Vec<String>);
- fn get_dev_package_names(&self) -> &Vec<String>;
+ fn get_dev_package_names(&self) -> Vec<String>;
}