1package webhook23import (4 "context"5 "fmt"67 gitm "github.com/aymanbagabas/git-module"8 "github.com/charmbracelet/soft-serve/git"9 "github.com/charmbracelet/soft-serve/pkg/config"10 "github.com/charmbracelet/soft-serve/pkg/db"11 "github.com/charmbracelet/soft-serve/pkg/proto"12 "github.com/charmbracelet/soft-serve/pkg/store"13)1415// PushEvent is a push event.16type PushEvent struct {17 Common1819 // Ref is the branch or tag name.20 Ref string `json:"ref" url:"ref"`21 // Before is the previous commit SHA.22 Before string `json:"before" url:"before"`23 // After is the current commit SHA.24 After string `json:"after" url:"after"`25 // Commits is the list of commits.26 Commits []Commit `json:"commits" url:"commits"`27}2829// NewPushEvent sends a push event.30func NewPushEvent(ctx context.Context, user proto.User, repo proto.Repository, ref, before, after string) (PushEvent, error) {31 event := EventPush3233 payload := PushEvent{34 Ref: ref,35 Before: before,36 After: after,37 Common: Common{38 EventType: event,39 Repository: Repository{40 ID: repo.ID(),41 Name: repo.Name(),42 Description: repo.Description(),43 ProjectName: repo.ProjectName(),44 Private: repo.IsPrivate(),45 CreatedAt: repo.CreatedAt(),46 UpdatedAt: repo.UpdatedAt(),47 },48 Sender: User{49 ID: user.ID(),50 Username: user.Username(),51 },52 },53 }5455 cfg := config.FromContext(ctx)56 payload.Repository.HTTPURL = repoURL(cfg.HTTP.PublicURL, repo.Name())57 payload.Repository.SSHURL = repoURL(cfg.SSH.PublicURL, repo.Name())58 payload.Repository.GitURL = repoURL(cfg.Git.PublicURL, repo.Name())5960 // Find repo owner.61 dbx := db.FromContext(ctx)62 datastore := store.FromContext(ctx)63 owner, err := datastore.GetUserByID(ctx, dbx, repo.UserID())64 if err != nil {65 return PushEvent{}, db.WrapError(err)66 }6768 payload.Repository.Owner.ID = owner.ID69 payload.Repository.Owner.Username = owner.Username7071 // Find commits.72 r, err := repo.Open()73 if err != nil {74 return PushEvent{}, err75 }7677 payload.Repository.DefaultBranch, _ = getDefaultBranch(repo)7879 rev := after80 if !git.IsZeroHash(before) {81 rev = fmt.Sprintf("%s..%s", before, after)82 }8384 commits, err := r.Log(rev, gitm.LogOptions{85 // XXX: limit to 20 commits for now86 // TODO: implement a commits api87 MaxCount: 20,88 })89 if err != nil {90 return PushEvent{}, err91 }9293 payload.Commits = make([]Commit, len(commits))94 for i, c := range commits {95 payload.Commits[i] = Commit{96 ID: c.ID.String(),97 Message: c.Message,98 Title: c.Summary(),99 Author: Author{100 Name: c.Author.Name,101 Email: c.Author.Email,102 Date: c.Author.When,103 },104 Committer: Author{105 Name: c.Committer.Name,106 Email: c.Committer.Email,107 Date: c.Committer.When,108 },109 Timestamp: c.Committer.When,110 }111 }112113 return payload, nil114}