Log error and proceed when failing to load repo environment (#27938)

Cole Miller created

Closes #ISSUE

Release Notes:

- N/A

Change summary

crates/project/src/environment.rs | 13 ++++++++++++-
crates/project/src/git_store.rs   |  9 +++++----
2 files changed, 17 insertions(+), 5 deletions(-)

Detailed changes

crates/project/src/environment.rs 🔗

@@ -60,7 +60,7 @@ impl ProjectEnvironment {
         }
     }
 
-    /// Returns an iterator over all pairs `(worktree_id, error_message)` of
+    /// Returns an iterator over all pairs `(abs_path, error_message)` of
     /// environment errors associated with this project environment.
     pub(crate) fn environment_errors(
         &self,
@@ -144,8 +144,15 @@ impl From<EnvironmentOrigin> for String {
     }
 }
 
+#[derive(Debug)]
 pub struct EnvironmentErrorMessage(pub String);
 
+impl std::fmt::Display for EnvironmentErrorMessage {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.0)
+    }
+}
+
 impl EnvironmentErrorMessage {
     #[allow(dead_code)]
     fn from_str(s: &str) -> Self {
@@ -361,6 +368,10 @@ fn get_directory_env(
 
         if let Some(error) = error_message {
             this.update(cx, |this, cx| {
+                log::error!(
+                    "error fetching environment for path {abs_path:?}: {}",
+                    error
+                );
                 this.environment_error_messages.insert(abs_path, error);
                 cx.emit(ProjectEnvironmentEvent::ErrorsUpdated)
             })

crates/project/src/git_store.rs 🔗

@@ -3632,12 +3632,13 @@ impl Repository {
                 .upgrade()
                 .ok_or_else(|| anyhow!("missing project environment"))?
                 .update(cx, |project_environment, cx| {
-                    project_environment.get_environment(Some(work_directory_abs_path), cx)
+                    project_environment.get_environment(Some(work_directory_abs_path.clone()), cx)
                 })?
                 .await
-                .ok_or_else(|| {
-                    anyhow!("failed to get environment for repository working directory")
-                })?;
+                .unwrap_or_else(|| {
+                    log::error!("failed to get working directory environment for repository {work_directory_abs_path:?}");
+                    HashMap::default()
+                });
             let backend = cx
                 .background_spawn(async move {
                     fs.open_repo(&dot_git_abs_path)