repo.go

 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}