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	// Populate last-modified file.
40	wg.Add(1)
41	go func() {
42		defer wg.Done()
43		if err := populateLastModified(d, repo); err != nil {
44			d.logger.Error("error populating last-modified", "repo", repo, "err", err)
45			return
46		}
47	}()
48
49	wg.Wait()
50}
51
52func populateLastModified(d *SqliteBackend, repo string) error {
53	var rr *Repo
54	_rr, err := d.Repository(repo)
55	if err != nil {
56		return err
57	}
58
59	if r, ok := _rr.(*Repo); ok {
60		rr = r
61	} else {
62		return ErrRepoNotExist
63	}
64
65	r, err := rr.Open()
66	if err != nil {
67		return err
68	}
69
70	c, err := r.LatestCommitTime()
71	if err != nil {
72		return err
73	}
74
75	return rr.writeLastModified(c)
76}