Restore trickle up git status to folder

Mikayla Maki and max created

co-authored-by: max <max@zed.dev>

Change summary

crates/project/src/worktree.rs | 24 +++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)

Detailed changes

crates/project/src/worktree.rs 🔗

@@ -55,7 +55,7 @@ use std::{
     time::{Duration, SystemTime},
 };
 use sum_tree::{Bias, Edit, SeekTarget, SumTree, TreeMap, TreeSet};
-use util::{paths::HOME, ResultExt, TryFutureExt};
+use util::{paths::HOME, ResultExt, TryFutureExt, TakeUntilExt};
 
 #[derive(Copy, Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
 pub struct WorktreeId(usize);
@@ -187,14 +187,20 @@ impl RepositoryEntry {
                 self.statuses
                     .iter_from(&repo_path)
                     .take_while(|(key, _)| key.starts_with(&repo_path))
-                    .map(|(path, status)| {
-                        if path == &repo_path {
-                            status
-                        } else {
-                            &GitFileStatus::Modified
-                        }
-                    })
-                    .next()
+                    // Short circut once we've found the highest level
+                    .take_until(|(_, status)| status == &&GitFileStatus::Conflict)
+                    .map(|(_, status)| status)
+                    .reduce(
+                        |status_first, status_second| match (status_first, status_second) {
+                            (GitFileStatus::Conflict, _) | (_, GitFileStatus::Conflict) => {
+                                &GitFileStatus::Conflict
+                            }
+                            (GitFileStatus::Modified, _) | (_, GitFileStatus::Modified) => {
+                                &GitFileStatus::Modified
+                            }
+                            _ => &GitFileStatus::Added,
+                        },
+                    )
                     .copied()
             })
     }