diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index 32ab5349639eda1f423d70d4077ba255debf3817..92fae951a5e46a81bce4bd1b57e59dea936d6509 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -716,10 +716,6 @@ impl GitPanel { &git_store, window, move |this, _git_store, event, window, cx| match event { - GitStoreEvent::ActiveRepositoryChanged(_) => { - this.active_repository = this.project.read(cx).active_repository(cx); - this.schedule_update(window, cx); - } GitStoreEvent::RepositoryUpdated( _, RepositoryEvent::StatusesChanged @@ -728,7 +724,8 @@ impl GitPanel { true, ) | GitStoreEvent::RepositoryAdded - | GitStoreEvent::RepositoryRemoved(_) => { + | GitStoreEvent::RepositoryRemoved(_) + | GitStoreEvent::ActiveRepositoryChanged(_) => { this.schedule_update(window, cx); } GitStoreEvent::IndexWriteError(error) => { @@ -3427,6 +3424,7 @@ impl GitPanel { .as_ref() .and_then(|op| self.entry_by_path(&op.anchor)); + self.active_repository = self.project.read(cx).active_repository(cx); self.entries.clear(); self.entries_indices.clear(); self.single_staged_entry.take(); @@ -4589,6 +4587,7 @@ impl GitPanel { fn render_entries( &self, has_write_access: bool, + repo: Entity, window: &mut Window, cx: &mut Context, ) -> impl IntoElement { @@ -4596,6 +4595,7 @@ impl GitPanel { GitPanelViewMode::Tree(state) => (true, state.logical_indices.len()), GitPanelViewMode::Flat => (false, self.entries.len()), }; + let repo = repo.downgrade(); v_flex() .flex_1() @@ -4613,6 +4613,11 @@ impl GitPanel { "entries", entry_count, cx.processor(move |this, range: Range, window, cx| { + let Some(repo) = repo.upgrade() else { + return Vec::new(); + }; + let repo = repo.read(cx); + let mut items = Vec::with_capacity(range.end - range.start); for ix in range.into_iter().map(|ix| match &this.view_mode { @@ -4626,6 +4631,7 @@ impl GitPanel { entry, 0, has_write_access, + repo, window, cx, )); @@ -4636,6 +4642,7 @@ impl GitPanel { &entry.entry, entry.depth, has_write_access, + repo, window, cx, )); @@ -4880,6 +4887,7 @@ impl GitPanel { entry: &GitStatusEntry, depth: usize, has_write_access: bool, + repo: &Repository, window: &Window, cx: &Context, ) -> AnyElement { @@ -4927,12 +4935,6 @@ impl GitPanel { let checkbox_id: ElementId = ElementId::Name(format!("entry_{}_{}_checkbox", display_name, ix).into()); - let active_repo = self - .project - .read(cx) - .active_repository(cx) - .expect("active repository must be set"); - let repo = active_repo.read(cx); let stage_status = GitPanel::stage_status_for_entry(entry, &repo); let mut is_staged: ToggleState = match stage_status { StageStatus::Staged => ToggleState::Selected, @@ -5472,8 +5474,10 @@ impl Render for GitPanel { .size_full() .children(self.render_panel_header(window, cx)) .map(|this| { - if has_entries { - this.child(self.render_entries(has_write_access, window, cx)) + if let Some(repo) = self.active_repository.clone() + && has_entries + { + this.child(self.render_entries(has_write_access, repo, window, cx)) } else { this.child(self.render_empty_state(cx).into_any_element()) }