forked from tangled.org/core
this repo has no description

knotserver: refactor post-receive hook

move the parsing logic into a separate file

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li e2385ead a4c38b84

verified
Changed files
+61 -34
knotserver
+41
knotserver/git/post_receive.go
···
+
package git
+
+
import (
+
"bufio"
+
"io"
+
"strings"
+
)
+
+
type PostReceiveLine struct {
+
OldSha string // old sha of reference being updated
+
NewSha string // new sha of reference being updated
+
Ref string // the reference being updated
+
}
+
+
func ParsePostReceive(buf io.Reader) ([]PostReceiveLine, error) {
+
scanner := bufio.NewScanner(buf)
+
var lines []PostReceiveLine
+
for scanner.Scan() {
+
line := scanner.Text()
+
parts := strings.SplitN(line, " ", 3)
+
if len(parts) != 3 {
+
continue
+
}
+
+
oldSha := parts[0]
+
newSha := parts[1]
+
ref := parts[2]
+
+
lines = append(lines, PostReceiveLine{
+
OldSha: oldSha,
+
NewSha: newSha,
+
Ref: ref,
+
})
+
}
+
+
if err := scanner.Err(); err != nil {
+
return nil, err
+
}
+
+
return lines, nil
+
}
+20 -34
knotserver/internal.go
···
package knotserver
import (
-
"bufio"
"context"
"log/slog"
"net/http"
"path/filepath"
-
"strings"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"tangled.sh/tangled.sh/core/knotserver/config"
"tangled.sh/tangled.sh/core/knotserver/db"
+
"tangled.sh/tangled.sh/core/knotserver/git"
"tangled.sh/tangled.sh/core/knotserver/notifier"
"tangled.sh/tangled.sh/core/rbac"
)
···
}
gitUserDid := r.Header.Get("X-Git-User-Did")
-
var ops []db.Op
-
scanner := bufio.NewScanner(r.Body)
-
for scanner.Scan() {
-
line := scanner.Text()
-
parts := strings.SplitN(line, " ", 3)
-
if len(parts) != 3 {
-
l.Error("invalid payload", "parts", parts)
-
continue
-
}
-
-
tid := TID()
-
oldSha := parts[0]
-
newSha := parts[1]
-
ref := parts[2]
-
op := db.Op{
-
Tid: tid,
-
Did: gitUserDid,
-
Repo: gitRelativeDir,
-
OldSha: oldSha,
-
NewSha: newSha,
-
Ref: ref,
-
}
-
ops = append(ops, op)
+
lines, err := git.ParsePostReceive(r.Body)
+
if err != nil {
+
l.Error("failed to parse post-receive payload", "err", err)
+
// non-fatal
}
-
if err := scanner.Err(); err != nil {
-
l.Error("failed to read payload", "err", err)
-
return
-
}
-
-
for _, op := range ops {
-
err := h.db.InsertOp(op, h.n)
+
for _, line := range lines {
+
err := h.updateOpLog(line, gitUserDid, gitRelativeDir)
if err != nil {
-
l.Error("failed to insert op", "err", err, "op", op)
-
continue
+
l.Error("failed to insert op", "err", err, "line", line, "did", gitUserDid, "repo", gitRelativeDir)
}
}
return
+
}
+
+
func (h *InternalHandle) updateOpLog(line git.PostReceiveLine, did, repo string) error {
+
op := db.Op{
+
Tid: TID(),
+
Did: did,
+
Repo: repo,
+
OldSha: line.OldSha,
+
NewSha: line.NewSha,
+
Ref: line.Ref,
+
}
+
return h.db.InsertOp(op, h.n)
}
func Internal(ctx context.Context, c *config.Config, db *db.DB, e *rbac.Enforcer, l *slog.Logger, n *notifier.Notifier) http.Handler {