Use current upstream for permalink to line (#26398)

Conrad Irwin created

Release Notes:

- git: Copy permalink to line now uses the upstream of the current
branch instead of "origin"

Change summary

crates/git/src/repository.rs       |  8 ++++++++
crates/project/src/buffer_store.rs | 12 +++++++++---
2 files changed, 17 insertions(+), 3 deletions(-)

Detailed changes

crates/git/src/repository.rs 🔗

@@ -56,6 +56,14 @@ pub struct Upstream {
     pub tracking: UpstreamTracking,
 }
 
+impl Upstream {
+    pub fn remote_name(&self) -> Option<&str> {
+        self.ref_name
+            .strip_prefix("refs/remotes/")
+            .and_then(|stripped| stripped.split("/").next())
+    }
+}
+
 #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
 pub enum UpstreamTracking {
     /// Remote ref not present in local repository.

crates/project/src/buffer_store.rs 🔗

@@ -1692,11 +1692,17 @@ impl BufferStore {
                     Err(e) => return Task::ready(Err(e)),
                 };
 
+                let remote = repo_entry
+                    .branch()
+                    .and_then(|b| b.upstream.as_ref())
+                    .and_then(|b| b.remote_name())
+                    .unwrap_or("origin")
+                    .to_string();
+
                 cx.spawn(|cx| async move {
-                    const REMOTE_NAME: &str = "origin";
                     let origin_url = repo
-                        .remote_url(REMOTE_NAME)
-                        .ok_or_else(|| anyhow!("remote \"{REMOTE_NAME}\" not found"))?;
+                        .remote_url(&remote)
+                        .ok_or_else(|| anyhow!("remote \"{remote}\" not found"))?;
 
                     let sha = repo
                         .head_sha()