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	_rr, err := d.Repository(repo)
 79	if err != nil {
 80		return err
 81	}
 82
 83	if r, ok := _rr.(*Repo); ok {
 84		rr = r
 85	} else {
 86		return ErrRepoNotExist
 87	}
 88
 89	r, err := rr.Open()
 90	if err != nil {
 91		return err
 92	}
 93
 94	c, err := r.LatestCommitTime()
 95	if err != nil {
 96		return err
 97	}
 98
 99	return rr.writeLastModified(c)
100}