Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

knotserver/internal: add create PR message on git push

Respond to a successful push with a URL to create a PR pointing to the
default branch. This behavior is made to mimic other Git forges.

Signed-off-by: Samuel Shuert <me@thecoded.prof>

authored by

Samuel Shuert and committed by
Tangled
d59f9a55 32a172c3

+46
+46
knotserver/internal.go
··· 13 13 securejoin "github.com/cyphar/filepath-securejoin" 14 14 "github.com/go-chi/chi/v5" 15 15 "github.com/go-chi/chi/v5/middleware" 16 + "github.com/go-git/go-git/v5/plumbing" 16 17 "tangled.org/core/api/tangled" 17 18 "tangled.org/core/hook" 19 + "tangled.org/core/idresolver" 18 20 "tangled.org/core/knotserver/config" 19 21 "tangled.org/core/knotserver/db" 20 22 "tangled.org/core/knotserver/git" ··· 120 118 // non-fatal 121 119 } 122 120 121 + if (line.NewSha.String() != line.OldSha.String()) && line.OldSha.IsZero() { 122 + msg, err := h.replyCompare(line, gitUserDid, gitRelativeDir, repoName, r.Context()) 123 + if err != nil { 124 + l.Error("failed to reply with compare link", "err", err, "line", line, "did", gitUserDid, "repo", gitRelativeDir) 125 + // non-fatal 126 + } else { 127 + for msgLine := range msg { 128 + resp.Messages = append(resp.Messages, msg[msgLine]) 129 + } 130 + } 131 + } 132 + 123 133 err = h.triggerPipeline(&resp.Messages, line, gitUserDid, repoDid, repoName, pushOptions) 124 134 if err != nil { 125 135 l.Error("failed to trigger pipeline", "err", err, "line", line, "did", gitUserDid, "repo", gitRelativeDir) ··· 140 126 } 141 127 142 128 writeJSON(w, resp) 129 + } 130 + 131 + func (h *InternalHandle) replyCompare(line git.PostReceiveLine, gitUserDid string, gitRelativeDir string, repoName string, ctx context.Context) ([]string, error) { 132 + l := h.l.With("handler", "replyCompare") 133 + userIdent, err := idresolver.DefaultResolver().ResolveIdent(ctx, gitUserDid) 134 + user := gitUserDid 135 + if err != nil { 136 + l.Error("Failed to fetch user identity", "err", err) 137 + // non-fatal 138 + } else { 139 + user = userIdent.Handle.String() 140 + } 141 + gr, err := git.PlainOpen(gitRelativeDir) 142 + if err != nil { 143 + l.Error("Failed to open git repository", "err", err) 144 + return []string{}, err 145 + } 146 + defaultBranch, err := gr.FindMainBranch() 147 + if err != nil { 148 + l.Error("Failed to fetch default branch", "err", err) 149 + return []string{}, err 150 + } 151 + if line.Ref == plumbing.NewBranchReferenceName(defaultBranch).String() { 152 + return []string{}, nil 153 + } 154 + ZWS := "\u200B" 155 + var msg []string 156 + msg = append(msg, ZWS) 157 + msg = append(msg, fmt.Sprintf("Create a PR pointing to %s", defaultBranch)) 158 + msg = append(msg, fmt.Sprintf("\t%s/%s/%s/compare/%s...%s", h.c.AppViewEndpoint, user, repoName, defaultBranch, strings.TrimPrefix(line.Ref, "refs/heads/"))) 159 + msg = append(msg, ZWS) 160 + return msg, nil 143 161 } 144 162 145 163 func (h *InternalHandle) insertRefUpdate(line git.PostReceiveLine, gitUserDid, repoDid, repoName string) error {