1package sqlite
2
3import (
4 "context"
5
6 "github.com/charmbracelet/soft-serve/git"
7 "github.com/charmbracelet/soft-serve/server/backend"
8 "github.com/jmoiron/sqlx"
9)
10
11var _ backend.Repository = (*Repo)(nil)
12
13// Repo is a Git repository with metadata stored in a SQLite database.
14type Repo struct {
15 name string
16 path string
17 db *sqlx.DB
18}
19
20// Description returns the repository's description.
21//
22// It implements backend.Repository.
23func (r *Repo) Description() string {
24 var desc string
25 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
26 return tx.Get(&desc, "SELECT description FROM repo WHERE name = ?", r.name)
27 }); err != nil {
28 return ""
29 }
30
31 return desc
32}
33
34// IsMirror returns whether the repository is a mirror.
35//
36// It implements backend.Repository.
37func (r *Repo) IsMirror() bool {
38 var mirror bool
39 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
40 return tx.Get(&mirror, "SELECT mirror FROM repo WHERE name = ?", r.name)
41 }); err != nil {
42 return false
43 }
44
45 return mirror
46}
47
48// IsPrivate returns whether the repository is private.
49//
50// It implements backend.Repository.
51func (r *Repo) IsPrivate() bool {
52 var private bool
53 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
54 return tx.Get(&private, "SELECT private FROM repo WHERE name = ?", r.name)
55 }); err != nil {
56 return false
57 }
58
59 return private
60}
61
62// Name returns the repository's name.
63//
64// It implements backend.Repository.
65func (r *Repo) Name() string {
66 return r.name
67}
68
69// Open opens the repository.
70//
71// It implements backend.Repository.
72func (r *Repo) Open() (*git.Repository, error) {
73 return git.Open(r.path)
74}
75
76// ProjectName returns the repository's project name.
77//
78// It implements backend.Repository.
79func (r *Repo) ProjectName() string {
80 var name string
81 if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
82 return tx.Get(&name, "SELECT project_name FROM repo WHERE name = ?", r.name)
83 }); err != nil {
84 return ""
85 }
86
87 return name
88}