back interdiff of round #1 and #0

hooks: add create PR message on git push #612

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

files
hook
knotserver
REVERTED
hook/hook.go
···
"strings"
"github.com/urfave/cli/v3"
-
"tangled.org/core/idresolver"
-
"tangled.org/core/knotserver/git"
)
type HookResponse struct {
···
client := &http.Client{}
-
gr, err := git.PlainOpen(gitDir)
-
defaultBranch, err := gr.FindMainBranch()
-
if err != nil {
-
fmt.Fprintln(os.Stderr, "failed to retrieve default branch")
-
return nil
-
}
-
gitPath := strings.Split(gitDir, "/")
-
repoName := gitPath[len(gitPath)-1]
-
userIdent, err := idresolver.DefaultResolver().ResolveIdent(ctx, userDid)
-
lines, err := git.ParsePostReceive(strings.NewReader(payload))
-
if err != nil {
-
return fmt.Errorf("failed to parse post-receive payload: %w", err)
-
}
-
for _, line := range lines {
-
if line.OldSha.IsZero() && line.OldSha != line.NewSha {
-
fmt.Fprintln(os.Stderr, "​")
-
fmt.Fprintf(os.Stderr, "Create a PR pointing to %s\n", defaultBranch)
-
fmt.Fprintf(os.Stderr, "\thttps://tangled.org/@%s/%s/compare/%s...%s\n", userIdent.Handle.String(), repoName, defaultBranch, strings.TrimPrefix(line.Ref, "refs/heads/"))
-
fmt.Fprintln(os.Stderr, "​")
-
}
-
}
-
req, err := http.NewRequest("POST", "http://"+endpoint+"/hooks/post-receive", strings.NewReader(payload))
if err != nil {
return fmt.Errorf("failed to create request: %w", err)
NEW
knotserver/internal.go
···
"github.com/go-chi/chi/v5/middleware"
"tangled.org/core/api/tangled"
"tangled.org/core/hook"
+
"tangled.org/core/idresolver"
"tangled.org/core/knotserver/config"
"tangled.org/core/knotserver/db"
"tangled.org/core/knotserver/git"
···
Messages: make([]string, 0),
}
+
userIdent, err := idresolver.DefaultResolver().ResolveIdent(r.Context(), gitUserDid)
+
user := gitUserDid
+
if err != nil {
+
l.Error("Failed to fetch user identity", "err", err)
+
// non-fatal
+
} else {
+
user = userIdent.Handle.String()
+
}
+
gr, err := git.PlainOpen(gitRelativeDir)
+
if err != nil {
+
l.Error("Failed to open git repository", "err", err)
+
return
+
}
+
defaultBranch, err := gr.FindMainBranch()
+
if err != nil {
+
l.Error("Failed to fetch default branch", "err", err)
+
return
+
}
+
for _, line := range lines {
err := h.insertRefUpdate(line, gitUserDid, repoDid, repoName)
if err != nil {
···
// non-fatal
}
+
if (line.NewSha.String() != line.OldSha.String()) && line.OldSha.IsZero() && (line.Ref != fmt.Sprint("refs/heads/", defaultBranch)) {
+
resp.Messages = append(resp.Messages, "​")
+
resp.Messages = append(resp.Messages, fmt.Sprintf("Create a PR pointing to %s", defaultBranch))
+
resp.Messages = append(resp.Messages, fmt.Sprintf("\t%s/@%s/%s/compare/%s...%s", h.c.AppViewEndpoint, user, repoName, defaultBranch, strings.TrimPrefix(line.Ref, "refs/heads/")))
+
resp.Messages = append(resp.Messages, "​")
+
}
+
err = h.triggerPipeline(&resp.Messages, line, gitUserDid, repoDid, repoName, pushOptions)
if err != nil {
l.Error("failed to trigger pipeline", "err", err, "line", line, "did", gitUserDid, "repo", gitRelativeDir)