hooks.go

 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}