fix(ui): show repo update time for new repos

Ayman Bagabas created

Change summary

server/backend/repo.go        |  5 +++++
server/backend/sqlite/repo.go | 21 +++++++++++++++++++++
ui/pages/selection/item.go    |  8 ++------
3 files changed, 28 insertions(+), 6 deletions(-)

Detailed changes

server/backend/repo.go 🔗

@@ -1,6 +1,8 @@
 package backend
 
 import (
+	"time"
+
 	"github.com/charmbracelet/soft-serve/git"
 )
 
@@ -78,6 +80,9 @@ type Repository interface {
 	IsMirror() bool
 	// IsHidden returns whether the repository is hidden.
 	IsHidden() bool
+	// UpdatedAt returns the time the repository was last updated.
+	// If the repository has never been updated, it returns the time it was created.
+	UpdatedAt() time.Time
 	// Open returns the underlying git.Repository.
 	Open() (*git.Repository, error)
 }

server/backend/sqlite/repo.go 🔗

@@ -2,6 +2,7 @@ package sqlite
 
 import (
 	"context"
+	"time"
 
 	"github.com/charmbracelet/soft-serve/git"
 	"github.com/charmbracelet/soft-serve/server/backend"
@@ -100,3 +101,23 @@ func (r *Repo) IsHidden() bool {
 
 	return hidden
 }
+
+// UpdatedAt returns the repository's last update time.
+func (r *Repo) UpdatedAt() time.Time {
+	rr, err := git.Open(r.path)
+	if err == nil {
+		t, err := rr.LatestCommitTime()
+		if err == nil {
+			return t
+		}
+	}
+
+	var updatedAt time.Time
+	if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
+		return tx.Get(&updatedAt, "SELECT updated_at FROM repo WHERE name = ?", r.name)
+	}); err != nil {
+		return time.Time{}
+	}
+
+	return updatedAt
+}

ui/pages/selection/item.go 🔗

@@ -56,13 +56,9 @@ type Item struct {
 
 // New creates a new Item.
 func NewItem(repo backend.Repository, cfg *config.Config) (Item, error) {
-	r, err := repo.Open()
-	if err != nil {
-		return Item{}, err
-	}
 	var lastUpdate *time.Time
-	lu, err := r.LatestCommitTime()
-	if err == nil {
+	lu := repo.UpdatedAt()
+	if !lu.IsZero() {
 		lastUpdate = &lu
 	}
 	return Item{