reload `Project` after deserialization

This commit is contained in:
Ibraheem Ahmed 2025-08-21 13:28:28 -04:00
parent 2402831223
commit 8d05367d60
3 changed files with 29 additions and 6 deletions

View File

@ -174,8 +174,7 @@ impl ProjectDatabase {
} }
for project in Project::load_all(self) { for project in Project::load_all(self) {
if project.metadata(self) == metadata { if project.resolve_settings(metadata, self)? {
project.resolve_settings(self)?;
self.project = Some(project); self.project = Some(project);
break; break;
} }

View File

@ -596,8 +596,29 @@ impl Project {
} }
/// Resolve the project settings after deserialization. /// Resolve the project settings after deserialization.
pub fn resolve_settings(&self, db: &dyn Db) -> Result<(), ToSettingsError> { ///
let metadata = self.metadata(db); /// Returns `Ok(true)` if the settings were resolved and the `Project` was updated,
/// or returns `Ok(false)` if a new `Project` should be created.
pub fn resolve_settings(
&self,
metadata: &ProjectMetadata,
db: &mut dyn Db,
) -> Result<bool, ToSettingsError> {
// Invalid project metadata.
if self.root(db) != metadata.root() {
return Ok(false);
}
// Reload the project if the metadata has changed.
if self.metadata(db) != metadata {
self.reload(db, metadata.clone());
}
// Otherwise, resolve the settings and diagnostics, which are not persisted.
//
// Note that we use the new `ProjectMetadata` here instead of the one that was
// persisted to ensure the `ValueSource` fields are updated even if the metadata
// values compare equal (but may come from new sources).
let (settings, diagnostics) = metadata.options().to_settings(db, metadata.root())?; let (settings, diagnostics) = metadata.options().to_settings(db, metadata.root())?;
self.raw_settings(db) self.raw_settings(db)
@ -608,7 +629,10 @@ impl Project {
.set(diagnostics) .set(diagnostics)
.expect("`Project::resolve_settings` should only be called once"); .expect("`Project::resolve_settings` should only be called once");
Ok(()) // And reload the project files, because we don't know if those have changed.
self.reload_files(db);
Ok(true)
} }
/// Loads all existing [`Project`]s in the database. /// Loads all existing [`Project`]s in the database.

View File

@ -19,7 +19,7 @@ pub mod pyproject;
pub mod settings; pub mod settings;
pub mod value; pub mod value;
#[derive(Debug, PartialEq, Eq, get_size2::GetSize, serde::Serialize, serde::Deserialize)] #[derive(Clone, Debug, PartialEq, Eq, get_size2::GetSize, serde::Serialize, serde::Deserialize)]
pub struct ProjectMetadata { pub struct ProjectMetadata {
pub(super) name: Name, pub(super) name: Name,