Add timestamps to branches

Piotr Osiewicz created

Change summary

Cargo.lock                          |  1 +
crates/collab_ui/src/branch_list.rs |  6 ++----
crates/fs/Cargo.toml                |  1 +
crates/fs/src/repository.rs         | 21 +++++++++++++++------
4 files changed, 19 insertions(+), 10 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -2549,6 +2549,7 @@ dependencies = [
  "smol",
  "sum_tree",
  "tempfile",
+ "time 0.3.21",
  "util",
 ]
 

crates/collab_ui/src/branch_list.rs 🔗

@@ -17,7 +17,6 @@ pub fn build_branch_list(
 ) -> BranchList {
     Picker::new(
         BranchListDelegate {
-            branches: vec!["Foo".into(), "bar/baz".into()],
             matches: vec![],
             project,
             selected_index: 0,
@@ -29,7 +28,6 @@ pub fn build_branch_list(
 }
 
 pub struct BranchListDelegate {
-    branches: Vec<String>,
     matches: Vec<StringMatch>,
     project: ModelHandle<Project>,
     selected_index: usize,
@@ -77,8 +75,8 @@ impl PickerDelegate for BranchListDelegate {
                         .enumerate()
                         .map(|(ix, command)| StringMatchCandidate {
                             id: ix,
-                            string: command.clone(),
-                            char_bag: command.chars().collect(),
+                            char_bag: command.name.chars().collect(),
+                            string: command.name.into(),
                         })
                         .collect::<Vec<_>>()
                 })

crates/fs/Cargo.toml 🔗

@@ -31,6 +31,7 @@ serde_derive.workspace = true
 serde_json.workspace = true
 log.workspace = true
 libc = "0.2"
+time.workspace = true
 
 [dev-dependencies]
 gpui = { path = "../gpui", features = ["test-support"] }

crates/fs/src/repository.rs 🔗

@@ -16,6 +16,12 @@ use util::ResultExt;
 
 pub use git2::Repository as LibGitRepository;
 
+#[derive(Clone, Debug, Hash, PartialEq)]
+pub struct Branch {
+    pub name: Box<str>,
+    /// Timestamp of most recent commit, normalized to Unix Epoch format.
+    pub unix_timestamp: Option<i64>,
+}
 #[async_trait::async_trait]
 pub trait GitRepository: Send {
     fn reload_index(&self);
@@ -27,7 +33,7 @@ pub trait GitRepository: Send {
     fn statuses(&self) -> Option<TreeMap<RepoPath, GitFileStatus>>;
 
     fn status(&self, path: &RepoPath) -> Result<Option<GitFileStatus>>;
-    fn branches(&self) -> Result<Vec<String>> {
+    fn branches(&self) -> Result<Vec<Branch>> {
         Ok(vec![])
     }
     fn change_branch(&self, _: &str) -> Result<()> {
@@ -112,14 +118,17 @@ impl GitRepository for LibGitRepository {
             }
         }
     }
-    fn branches(&self) -> Result<Vec<String>> {
+    fn branches(&self) -> Result<Vec<Branch>> {
         let local_branches = self.branches(Some(BranchType::Local))?;
         let valid_branches = local_branches
             .filter_map(|branch| {
-                branch
-                    .ok()
-                    .map(|(branch, _)| branch.name().ok().flatten().map(String::from))
-                    .flatten()
+                branch.ok().and_then(|(branch, _)| {
+                    let name = branch.name().ok().flatten().map(Box::from)?;
+                    Some(Branch {
+                        name,
+                        unix_timestamp: None,
+                    })
+                })
             })
             .collect();
         Ok(valid_branches)