···
···
-
mergeCheckResponse := s.mergeCheck(f, pull, stack)
resubmitResult := pages.Unknown
if user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(f, pull, stack)
···
-
mergeCheckResponse := s.mergeCheck(f, pull, stack)
resubmitResult := pages.Unknown
if user != nil && user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(f, pull, stack)
···
-
func (s *Pulls) mergeCheck(f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) types.MergeCheckResponse {
if pull.State == db.PullMerged {
return types.MergeCheckResponse{}
-
secret, err := db.GetRegistrationKey(s.db, f.Knot)
-
log.Printf("failed to get registration key: %v", err)
-
return types.MergeCheckResponse{
-
Error: "failed to check merge status: this knot is unregistered",
-
ksClient, err := knotclient.NewSignedClient(f.Knot, secret, s.config.Core.Dev)
-
log.Printf("failed to setup signed client for %s; ignoring: %v", f.Knot, err)
return types.MergeCheckResponse{
-
Error: "failed to check merge status",
···
patch = mergeable.CombinedPatch()
-
resp, err := ksClient.MergeCheck([]byte(patch), f.OwnerDid(), f.Name, pull.TargetBranch)
-
log.Println("failed to check for mergeability:", err)
return types.MergeCheckResponse{
-
Error: "failed to check merge status",
-
switch resp.StatusCode {
-
return types.MergeCheckResponse{
-
Error: "failed to check merge status: this knot does not support PRs",
-
return types.MergeCheckResponse{
-
Error: "failed to check merge status: does this knot support PRs?",
-
respBody, err := io.ReadAll(resp.Body)
-
log.Println("failed to read merge check response body")
-
return types.MergeCheckResponse{
-
Error: "failed to check merge status: knot is not speaking the right language",
-
defer resp.Body.Close()
-
var mergeCheckResponse types.MergeCheckResponse
-
err = json.Unmarshal(respBody, &mergeCheckResponse)
-
log.Println("failed to unmarshal merge check response", err)
-
return types.MergeCheckResponse{
-
Error: "failed to check merge status: knot is not speaking the right language",
-
return mergeCheckResponse
func (s *Pulls) resubmitCheck(f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) pages.ResubmitResult {
···
-
secret, err := db.GetRegistrationKey(s.db, fork.Knot)
-
log.Println("failed to fetch registration key:", err)
-
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
-
sc, err := knotclient.NewSignedClient(fork.Knot, secret, s.config.Core.Dev)
-
log.Println("failed to create signed client:", err)
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
···
-
resp, err := sc.NewHiddenRef(user.Did, fork.Name, sourceBranch, targetBranch)
-
log.Println("failed to create hidden ref:", err, resp.StatusCode)
-
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
-
switch resp.StatusCode {
-
s.pages.Notice(w, "pull", "Branch based pull requests are not supported on this knot.")
···
-
secret, err := db.GetRegistrationKey(s.db, forkRepo.Knot)
-
log.Printf("failed to get registration key for %s: %s", forkRepo.Knot, err)
-
s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
// update the hidden tracking branch to latest
-
signedClient, err := knotclient.NewSignedClient(forkRepo.Knot, secret, s.config.Core.Dev)
-
log.Printf("failed to create signed client for %s: %s", forkRepo.Knot, err)
-
s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
-
resp, err := signedClient.NewHiddenRef(forkRepo.Did, forkRepo.Name, pull.PullSource.Branch, pull.TargetBranch)
-
if err != nil || resp.StatusCode != http.StatusNoContent {
-
log.Printf("failed to update tracking branch: %s", err)
s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
···
patch := pullsToMerge.CombinedPatch()
-
secret, err := db.GetRegistrationKey(s.db, f.Knot)
-
log.Printf("no registration key found for domain %s: %s\n", f.Knot, err)
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
···
log.Printf("failed to get primary email: %s", err)
-
ksClient, err := knotclient.NewSignedClient(f.Knot, secret, s.config.Core.Dev)
-
log.Printf("failed to create signed client for %s: %s", f.Knot, err)
-
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
-
// Merge the pull request
-
resp, err := ksClient.Merge([]byte(patch), f.OwnerDid(), f.Name, pull.TargetBranch, pull.Title, pull.Body, ident.Handle.String(), email.Address)
-
log.Printf("failed to merge pull request: %s", err)
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
-
if resp.StatusCode != http.StatusOK {
-
log.Printf("knotserver returned non-OK status code for merge: %d", resp.StatusCode)
-
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
···
···
+
mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
resubmitResult := pages.Unknown
if user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(f, pull, stack)
···
+
mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
resubmitResult := pages.Unknown
if user != nil && user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(f, pull, stack)
···
+
func (s *Pulls) mergeCheck(r *http.Request, f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) types.MergeCheckResponse {
if pull.State == db.PullMerged {
return types.MergeCheckResponse{}
+
client, err := s.oauth.ServiceClient(
+
oauth.WithService(f.Knot),
+
oauth.WithLxm(tangled.RepoMergeCheckNSID),
+
oauth.WithDev(s.config.Core.Dev),
+
log.Printf("failed to connect to knot server: %v", err)
return types.MergeCheckResponse{
+
Error: "failed to check merge status: could not connect to knot server",
···
patch = mergeable.CombinedPatch()
+
resp, xe := tangled.RepoMergeCheck(
+
&tangled.RepoMergeCheck_Input{
+
Branch: pull.TargetBranch,
+
if err := xrpcclient.HandleXrpcErr(xe); err != nil {
+
log.Println("failed to check for mergeability", "err", err)
return types.MergeCheckResponse{
+
Error: fmt.Sprintf("failed to check merge status: %s", err.Error()),
+
// convert xrpc response to internal types
+
conflicts := make([]types.ConflictInfo, len(resp.Conflicts))
+
for i, conflict := range resp.Conflicts {
+
conflicts[i] = types.ConflictInfo{
+
Filename: conflict.Filename,
+
Reason: conflict.Reason,
+
result := types.MergeCheckResponse{
+
IsConflicted: resp.Is_conflicted,
+
if resp.Message != nil {
+
result.Message = *resp.Message
+
result.Error = *resp.Error
func (s *Pulls) resubmitCheck(f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) pages.ResubmitResult {
···
+
client, err := s.oauth.ServiceClient(
+
oauth.WithService(fork.Knot),
+
oauth.WithLxm(tangled.RepoHiddenRefNSID),
+
oauth.WithDev(s.config.Core.Dev),
+
log.Printf("failed to connect to knot server: %v", err)
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
···
+
resp, err := tangled.RepoHiddenRef(
+
&tangled.RepoHiddenRef_Input{
+
RemoteRef: targetBranch,
+
Repo: fork.RepoAt().String(),
+
xe, parseErr := xrpcerr.Unmarshal(err.Error())
+
log.Printf("failed to create hidden ref: %v", err)
+
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
+
log.Printf("failed to create hidden ref: %s", xe.Error())
+
if xe.Tag == "AccessControl" {
+
s.pages.Notice(w, "pull", "Branch based pull requests are not supported on this knot.")
+
s.pages.Notice(w, "pull", fmt.Sprintf("Failed to create pull request: %s", xe.Message))
+
errorMsg := "Failed to create pull request"
+
errorMsg = fmt.Sprintf("Failed to create pull request: %s", *resp.Error)
+
s.pages.Notice(w, "pull", errorMsg)
···
// update the hidden tracking branch to latest
+
client, err := s.oauth.ServiceClient(
+
oauth.WithService(forkRepo.Knot),
+
oauth.WithLxm(tangled.RepoHiddenRefNSID),
+
oauth.WithDev(s.config.Core.Dev),
+
log.Printf("failed to connect to knot server: %v", err)
+
resp, err := tangled.RepoHiddenRef(
+
&tangled.RepoHiddenRef_Input{
+
ForkRef: pull.PullSource.Branch,
+
RemoteRef: pull.TargetBranch,
+
Repo: forkRepo.RepoAt().String(),
+
if err != nil || !resp.Success {
+
log.Printf("failed to update tracking branch: %s", err)
+
log.Printf("failed to update tracking branch: success=false")
s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
···
patch := pullsToMerge.CombinedPatch()
+
client, err := s.oauth.ServiceClient(
+
oauth.WithService(f.Knot),
+
oauth.WithLxm(tangled.RepoMergeNSID),
+
oauth.WithDev(s.config.Core.Dev),
+
log.Printf("failed to connect to knot server: %v", err)
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
···
log.Printf("failed to get primary email: %s", err)
+
authorName := ident.Handle.String()
+
mergeInput := &tangled.RepoMerge_Input{
+
Branch: pull.TargetBranch,
+
CommitMessage: &pull.Title,
+
AuthorName: &authorName,
+
mergeInput.CommitBody = &pull.Body
+
if email.Address != "" {
+
mergeInput.AuthorEmail = &email.Address
+
client, err := s.oauth.ServiceClient(
+
oauth.WithService(f.Knot),
+
oauth.WithLxm(tangled.RepoMergeNSID),
+
oauth.WithDev(s.config.Core.Dev),
+
log.Printf("failed to connect to knot server: %v", err)
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
+
err = tangled.RepoMerge(r.Context(), client, mergeInput)
+
if err := xrpcclient.HandleXrpcErr(err); err != nil {
+
s.pages.Notice(w, "pull-merge-error", err.Error())