···
···
"tangled.sh/tangled.sh/core/patchutil"
"tangled.sh/tangled.sh/core/tid"
"tangled.sh/tangled.sh/core/types"
26
+
xrpcerr "tangled.sh/tangled.sh/core/xrpc/errors"
"github.com/bluekeyes/go-gitdiff/gitdiff"
comatproto "github.com/bluesky-social/indigo/api/atproto"
···
99
-
mergeCheckResponse := s.mergeCheck(f, pull, stack)
98
+
mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
resubmitResult := pages.Unknown
if user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(f, pull, stack)
···
164
-
mergeCheckResponse := s.mergeCheck(f, pull, stack)
163
+
mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
resubmitResult := pages.Unknown
if user != nil && user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(f, pull, stack)
···
229
-
func (s *Pulls) mergeCheck(f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) types.MergeCheckResponse {
228
+
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{}
234
-
secret, err := db.GetRegistrationKey(s.db, f.Knot)
233
+
client, err := s.oauth.ServiceClient(
235
+
oauth.WithService(f.Knot),
236
+
oauth.WithLxm(tangled.RepoMergeCheckNSID),
237
+
oauth.WithDev(s.config.Core.Dev),
236
-
log.Printf("failed to get registration key: %v", err)
240
+
log.Printf("failed to connect to knot server: %v", err)
return types.MergeCheckResponse{
238
-
Error: "failed to check merge status: this knot is unregistered",
242
-
ksClient, err := knotclient.NewSignedClient(f.Knot, secret, s.config.Core.Dev)
244
-
log.Printf("failed to setup signed client for %s; ignoring: %v", f.Knot, err)
245
-
return types.MergeCheckResponse{
246
-
Error: "failed to check merge status",
242
+
Error: "failed to check merge status: could not connect to knot server",
···
patch = mergeable.CombinedPatch()
260
-
resp, err := ksClient.MergeCheck([]byte(patch), f.OwnerDid(), f.RepoName, pull.TargetBranch)
256
+
resp, err := tangled.RepoMergeCheck(
259
+
&tangled.RepoMergeCheck_Input{
262
+
Branch: pull.TargetBranch,
262
-
log.Println("failed to check for mergeability:", err)
263
-
return types.MergeCheckResponse{
264
-
Error: "failed to check merge status",
267
-
switch resp.StatusCode {
269
-
return types.MergeCheckResponse{
270
-
Error: "failed to check merge status: this knot does not support PRs",
267
+
xe, parseErr := xrpcerr.Unmarshal(err.Error())
268
+
if parseErr != nil {
269
+
log.Printf("failed to check for mergeability: %v", err)
270
+
return types.MergeCheckResponse{
271
+
Error: "failed to check merge status",
274
+
log.Printf("failed to check for mergeability: %s", xe.Error())
return types.MergeCheckResponse{
274
-
Error: "failed to check merge status: does this knot support PRs?",
276
+
Error: fmt.Sprintf("failed to check merge status: %s", xe.Message),
278
-
respBody, err := io.ReadAll(resp.Body)
280
-
log.Println("failed to read merge check response body")
281
-
return types.MergeCheckResponse{
282
-
Error: "failed to check merge status: knot is not speaking the right language",
280
+
// convert xrpc response to internal types
281
+
conflicts := make([]types.ConflictInfo, len(resp.Conflicts))
282
+
for i, conflict := range resp.Conflicts {
283
+
conflicts[i] = types.ConflictInfo{
284
+
Filename: conflict.Filename,
285
+
Reason: conflict.Reason,
285
-
defer resp.Body.Close()
287
-
var mergeCheckResponse types.MergeCheckResponse
288
-
err = json.Unmarshal(respBody, &mergeCheckResponse)
290
-
log.Println("failed to unmarshal merge check response", err)
291
-
return types.MergeCheckResponse{
292
-
Error: "failed to check merge status: knot is not speaking the right language",
289
+
result := types.MergeCheckResponse{
290
+
IsConflicted: resp.Is_conflicted,
291
+
Conflicts: conflicts,
296
-
return mergeCheckResponse
294
+
if resp.Message != nil {
295
+
result.Message = *resp.Message
298
+
if resp.Error != nil {
299
+
result.Error = *resp.Error
func (s *Pulls) resubmitCheck(f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) pages.ResubmitResult {
···
926
-
secret, err := db.GetRegistrationKey(s.db, fork.Knot)
932
+
client, err := s.oauth.ServiceClient(
934
+
oauth.WithService(fork.Knot),
935
+
oauth.WithLxm(tangled.RepoHiddenRefNSID),
936
+
oauth.WithDev(s.config.Core.Dev),
928
-
log.Println("failed to fetch registration key:", err)
929
-
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
933
-
sc, err := knotclient.NewSignedClient(fork.Knot, secret, s.config.Core.Dev)
935
-
log.Println("failed to create signed client:", err)
939
+
log.Printf("failed to connect to knot server: %v", err)
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
···
947
-
resp, err := sc.NewHiddenRef(user.Did, fork.Name, sourceBranch, targetBranch)
951
+
resp, err := tangled.RepoHiddenRef(
954
+
&tangled.RepoHiddenRef_Input{
955
+
ForkRef: sourceBranch,
956
+
RemoteRef: targetBranch,
949
-
log.Println("failed to create hidden ref:", err, resp.StatusCode)
950
-
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
961
+
xe, parseErr := xrpcerr.Unmarshal(err.Error())
962
+
if parseErr != nil {
963
+
log.Printf("failed to create hidden ref: %v", err)
964
+
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
966
+
log.Printf("failed to create hidden ref: %s", xe.Error())
967
+
if xe.Tag == "AccessControl" {
968
+
s.pages.Notice(w, "pull", "Branch based pull requests are not supported on this knot.")
970
+
s.pages.Notice(w, "pull", fmt.Sprintf("Failed to create pull request: %s", xe.Message))
954
-
switch resp.StatusCode {
957
-
s.pages.Notice(w, "pull", "Branch based pull requests are not supported on this knot.")
977
+
errorMsg := "Failed to create pull request"
978
+
if resp.Error != nil {
979
+
errorMsg = fmt.Sprintf("Failed to create pull request: %s", *resp.Error)
981
+
s.pages.Notice(w, "pull", errorMsg)
···
1527
-
secret, err := db.GetRegistrationKey(s.db, forkRepo.Knot)
1529
-
log.Printf("failed to get registration key for %s: %s", forkRepo.Knot, err)
1530
-
s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
// update the hidden tracking branch to latest
1535
-
signedClient, err := knotclient.NewSignedClient(forkRepo.Knot, secret, s.config.Core.Dev)
1552
+
client, err := s.oauth.ServiceClient(
1554
+
oauth.WithService(forkRepo.Knot),
1555
+
oauth.WithLxm(tangled.RepoHiddenRefNSID),
1556
+
oauth.WithDev(s.config.Core.Dev),
1537
-
log.Printf("failed to create signed client for %s: %s", forkRepo.Knot, err)
1538
-
s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
1559
+
log.Printf("failed to connect to knot server: %v", err)
1542
-
resp, err := signedClient.NewHiddenRef(forkRepo.Did, forkRepo.Name, pull.PullSource.Branch, pull.TargetBranch)
1543
-
if err != nil || resp.StatusCode != http.StatusNoContent {
1544
-
log.Printf("failed to update tracking branch: %s", err)
1563
+
resp, err := tangled.RepoHiddenRef(
1566
+
&tangled.RepoHiddenRef_Input{
1567
+
ForkRef: pull.PullSource.Branch,
1568
+
RemoteRef: pull.TargetBranch,
1569
+
Repo: forkRepo.AtUri,
1572
+
if err != nil || !resp.Success {
1574
+
log.Printf("failed to update tracking branch: %s", err)
1576
+
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()
1961
-
secret, err := db.GetRegistrationKey(s.db, f.Knot)
1994
+
client, err := s.oauth.ServiceClient(
1996
+
oauth.WithService(f.Knot),
1997
+
oauth.WithLxm(tangled.RepoMergeNSID),
1998
+
oauth.WithDev(s.config.Core.Dev),
1963
-
log.Printf("no registration key found for domain %s: %s\n", f.Knot, err)
2001
+
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)
1980
-
ksClient, err := knotclient.NewSignedClient(f.Knot, secret, s.config.Core.Dev)
1982
-
log.Printf("failed to create signed client for %s: %s", f.Knot, err)
1983
-
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
2018
+
authorName := ident.Handle.String()
2019
+
mergeInput := &tangled.RepoMerge_Input{
2020
+
Did: f.OwnerDid(),
2022
+
Branch: pull.TargetBranch,
2024
+
CommitMessage: &pull.Title,
2025
+
AuthorName: &authorName,
2028
+
if pull.Body != "" {
2029
+
mergeInput.CommitBody = &pull.Body
1987
-
// Merge the pull request
1988
-
resp, err := ksClient.Merge([]byte(patch), f.OwnerDid(), f.RepoName, pull.TargetBranch, pull.Title, pull.Body, ident.Handle.String(), email.Address)
1990
-
log.Printf("failed to merge pull request: %s", err)
1991
-
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
2032
+
if email.Address != "" {
2033
+
mergeInput.AuthorEmail = &email.Address
1995
-
if resp.StatusCode != http.StatusOK {
1996
-
log.Printf("knotserver returned non-OK status code for merge: %d", resp.StatusCode)
1997
-
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
2036
+
err = tangled.RepoMerge(r.Context(), client, mergeInput)
2038
+
xe, parseErr := xrpcerr.Unmarshal(err.Error())
2039
+
if parseErr != nil {
2040
+
log.Printf("failed to merge pull request: %v", err)
2041
+
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
2043
+
log.Printf("failed to merge pull request: %s", xe.Error())
2044
+
s.pages.Notice(w, "pull-merge-error", fmt.Sprintf("Failed to merge pull request: %s", xe.Message))