···
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"tangled.sh/tangled.sh/core/api/tangled"
···
"tangled.sh/tangled.sh/core/knotserver/git"
"tangled.sh/tangled.sh/core/knotserver/notifier"
"tangled.sh/tangled.sh/core/rbac"
type InternalHandle struct {
···
l.Error("failed to insert op", "err", err, "line", line, "did", gitUserDid, "repo", gitRelativeDir)
···
Nsid: tangled.GitRefUpdateNSID,
EventJson: string(eventJson),
···
+
securejoin "github.com/cyphar/filepath-securejoin"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"tangled.sh/tangled.sh/core/api/tangled"
···
"tangled.sh/tangled.sh/core/knotserver/git"
"tangled.sh/tangled.sh/core/knotserver/notifier"
"tangled.sh/tangled.sh/core/rbac"
+
"tangled.sh/tangled.sh/core/workflow"
type InternalHandle struct {
···
l.Error("failed to insert op", "err", err, "line", line, "did", gitUserDid, "repo", gitRelativeDir)
+
err = h.triggerPipeline(line, gitUserDid, repoDid, repoName)
+
l.Error("failed to trigger pipeline", "err", err, "line", line, "did", gitUserDid, "repo", gitRelativeDir)
···
Nsid: tangled.GitRefUpdateNSID,
+
EventJson: string(eventJson),
+
return h.db.InsertEvent(event, h.n)
+
func (h *InternalHandle) triggerPipeline(line git.PostReceiveLine, gitUserDid, repoDid, repoName string) error {
+
WorkflowDir = ".tangled/workflows"
+
didSlashRepo, err := securejoin.SecureJoin(repoDid, repoName)
+
repoPath, err := securejoin.SecureJoin(h.c.Repo.ScanPath, didSlashRepo)
+
gr, err := git.Open(repoPath, line.Ref)
+
workflowDir, err := gr.FileTree(context.Background(), WorkflowDir)
+
var pipeline workflow.Pipeline
+
for _, e := range workflowDir {
+
fpath := filepath.Join(WorkflowDir, e.Name)
+
contents, err := gr.RawContent(fpath)
+
wf, err := workflow.FromFile(e.Name, contents)
+
// TODO: log here, respond to client that is pushing
+
pipeline = append(pipeline, wf)
+
trigger := tangled.Pipeline_PushTriggerData{
+
compiler := workflow.Compiler{
+
Trigger: tangled.Pipeline_TriggerMetadata{
+
Kind: string(workflow.TriggerKindPush),
+
Repo: &tangled.Pipeline_TriggerRepo{
+
Knot: h.c.Server.Hostname,
+
// TODO: send the diagnostics back to the user here via stderr
+
cp := compiler.Compile(pipeline)
+
eventJson, err := json.Marshal(cp)
+
Nsid: tangled.PipelineNSID,
EventJson: string(eventJson),