1package sqlite
2
3import (
4 "context"
5 "time"
6
7 "github.com/charmbracelet/soft-serve/git"
8 "github.com/charmbracelet/soft-serve/server/backend"
9 "github.com/jmoiron/sqlx"
10)
11
12var _ backend.Repository = (*Repo)(nil)
13
14// Repo is a Git repository with metadata stored in a SQLite database.
15type Repo struct {
16 name string
17 path string
18 db *sqlx.DB
19}
20
21// Description returns the repository's description.
22//
23// It implements backend.Repository.
24func (r *Repo) Description() string {
25 var desc string
26 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
27 return tx.Get(&desc, "SELECT description FROM repo WHERE name = ?", r.name)
28 }); err != nil {
29 return ""
30 }
31
32 return desc
33}
34
35// IsMirror returns whether the repository is a mirror.
36//
37// It implements backend.Repository.
38func (r *Repo) IsMirror() bool {
39 var mirror bool
40 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
41 return tx.Get(&mirror, "SELECT mirror FROM repo WHERE name = ?", r.name)
42 }); err != nil {
43 return false
44 }
45
46 return mirror
47}
48
49// IsPrivate returns whether the repository is private.
50//
51// It implements backend.Repository.
52func (r *Repo) IsPrivate() bool {
53 var private bool
54 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
55 return tx.Get(&private, "SELECT private FROM repo WHERE name = ?", r.name)
56 }); err != nil {
57 return false
58 }
59
60 return private
61}
62
63// Name returns the repository's name.
64//
65// It implements backend.Repository.
66func (r *Repo) Name() string {
67 return r.name
68}
69
70// Open opens the repository.
71//
72// It implements backend.Repository.
73func (r *Repo) Open() (*git.Repository, error) {
74 return git.Open(r.path)
75}
76
77// ProjectName returns the repository's project name.
78//
79// It implements backend.Repository.
80func (r *Repo) ProjectName() string {
81 var name string
82 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
83 return tx.Get(&name, "SELECT project_name FROM repo WHERE name = ?", r.name)
84 }); err != nil {
85 return ""
86 }
87
88 return name
89}
90
91// IsHidden returns whether the repository is hidden.
92//
93// It implements backend.Repository.
94func (r *Repo) IsHidden() bool {
95 var hidden bool
96 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
97 return tx.Get(&hidden, "SELECT hidden FROM repo WHERE name = ?", r.name)
98 }); err != nil {
99 return false
100 }
101
102 return hidden
103}
104
105// UpdatedAt returns the repository's last update time.
106func (r *Repo) UpdatedAt() time.Time {
107 rr, err := git.Open(r.path)
108 if err == nil {
109 t, err := rr.LatestCommitTime()
110 if err == nil {
111 return t
112 }
113 }
114
115 var updatedAt time.Time
116 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
117 return tx.Get(&updatedAt, "SELECT updated_at FROM repo WHERE name = ?", r.name)
118 }); err != nil {
119 return time.Time{}
120 }
121
122 return updatedAt
123}