git: Always reload current branch after pushing (#28327)

Cole Miller created

Closes #27347 

Release Notes:

- Fixed a bug causing the git panel to not update after pushing to a
remote

Change summary

crates/project/src/git_store.rs | 39 +++++++++++++++++++++++++++++-----
1 file changed, 33 insertions(+), 6 deletions(-)

Detailed changes

crates/project/src/git_store.rs 🔗

@@ -3263,7 +3263,7 @@ impl Repository {
         remote: SharedString,
         options: Option<PushOptions>,
         askpass: AskPassDelegate,
-        _cx: &mut App,
+        cx: &mut Context<Self>,
     ) -> oneshot::Receiver<Result<RemoteCommandOutput>> {
         let askpass_delegates = self.askpass_delegates.clone();
         let askpass_id = util::post_inc(&mut self.latest_askpass_id);
@@ -3276,25 +3276,52 @@ impl Repository {
             })
             .unwrap_or("");
 
+        let updates_tx = self
+            .git_store()
+            .and_then(|git_store| match &git_store.read(cx).state {
+                GitStoreState::Local { downstream, .. } => downstream
+                    .as_ref()
+                    .map(|downstream| downstream.updates_tx.clone()),
+                _ => None,
+            });
+
+        let this = cx.weak_entity();
         self.send_job(
-            Some(format!("git push{} {} {}", args, branch, remote).into()),
-            move |git_repo, cx| async move {
+            Some(format!("git push {} {} {}", args, branch, remote).into()),
+            move |git_repo, mut cx| async move {
                 match git_repo {
                     RepositoryState::Local {
                         backend,
                         environment,
                         ..
                     } => {
-                        backend
+                        let result = backend
                             .push(
                                 branch.to_string(),
                                 remote.to_string(),
                                 options,
                                 askpass,
                                 environment.clone(),
-                                cx,
+                                cx.clone(),
                             )
-                            .await
+                            .await;
+                        if result.is_ok() {
+                            let branches = backend.branches().await?;
+                            let branch = branches.into_iter().find(|branch| branch.is_head);
+                            log::info!("head branch after scan is {branch:?}");
+                            let snapshot = this.update(&mut cx, |this, cx| {
+                                this.snapshot.branch = branch;
+                                let snapshot = this.snapshot.clone();
+                                cx.emit(RepositoryEvent::Updated { full_scan: false });
+                                snapshot
+                            })?;
+                            if let Some(updates_tx) = updates_tx {
+                                updates_tx
+                                    .unbounded_send(DownstreamUpdate::UpdateRepository(snapshot))
+                                    .ok();
+                            }
+                        }
+                        result
                     }
                     RepositoryState::Remote { project_id, client } => {
                         askpass_delegates.lock().insert(askpass_id, askpass);