1package sqlite
2
3import (
4 "io"
5 "sync"
6
7 "github.com/charmbracelet/soft-serve/server/backend"
8)
9
10// PostReceive is called by the git post-receive hook.
11//
12// It implements Hooks.
13func (d *SqliteBackend) PostReceive(stdout io.Writer, stderr io.Writer, repo string, args []backend.HookArg) {
14 d.logger.Debug("post-receive hook called", "repo", repo, "args", args)
15}
16
17// PreReceive is called by the git pre-receive hook.
18//
19// It implements Hooks.
20func (d *SqliteBackend) PreReceive(stdout io.Writer, stderr io.Writer, repo string, args []backend.HookArg) {
21 d.logger.Debug("pre-receive hook called", "repo", repo, "args", args)
22}
23
24// Update is called by the git update hook.
25//
26// It implements Hooks.
27func (d *SqliteBackend) Update(stdout io.Writer, stderr io.Writer, repo string, arg backend.HookArg) {
28 d.logger.Debug("update hook called", "repo", repo, "arg", arg)
29}
30
31// PostUpdate is called by the git post-update hook.
32//
33// It implements Hooks.
34func (d *SqliteBackend) PostUpdate(stdout io.Writer, stderr io.Writer, repo string, args ...string) {
35 d.logger.Debug("post-update hook called", "repo", repo, "args", args)
36
37 var wg sync.WaitGroup
38
39 // Update server info
40 wg.Add(1)
41 go func() {
42 defer wg.Done()
43 if err := updateServerInfo(d, repo); err != nil {
44 d.logger.Error("error updating server-info", "repo", repo, "err", err)
45 return
46 }
47 }()
48
49 // Populate last-modified file.
50 wg.Add(1)
51 go func() {
52 defer wg.Done()
53 if err := populateLastModified(d, repo); err != nil {
54 d.logger.Error("error populating last-modified", "repo", repo, "err", err)
55 return
56 }
57 }()
58
59 wg.Wait()
60}
61
62func updateServerInfo(d *SqliteBackend, repo string) error {
63 rr, err := d.Repository(repo)
64 if err != nil {
65 return err
66 }
67
68 r, err := rr.Open()
69 if err != nil {
70 return err
71 }
72
73 return r.UpdateServerInfo()
74}
75
76func populateLastModified(d *SqliteBackend, repo string) error {
77 var rr *Repo
78 if rr, err := d.Repository(repo); err != nil {
79 return err
80 } else if r, ok := rr.(*Repo); ok {
81 rr = r
82 } else {
83 return ErrRepoNotExist
84 }
85
86 r, err := rr.Open()
87 if err != nil {
88 return err
89 }
90
91 c, err := r.LatestCommitTime()
92 if err != nil {
93 return err
94 }
95
96 return rr.writeLastModified(c)
97}