···
···
99
-
mergeCheckResponse := s.mergeCheck(f, pull, stack)
97
+
mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
resubmitResult := pages.Unknown
if user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(f, pull, stack)
···
154
-
mergeCheckResponse := s.mergeCheck(f, pull, stack)
152
+
mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
resubmitResult := pages.Unknown
if user != nil && user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(f, pull, stack)
···
218
-
func (s *Pulls) mergeCheck(f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) types.MergeCheckResponse {
216
+
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{}
223
-
secret, err := db.GetRegistrationKey(s.db, f.Knot)
225
-
log.Printf("failed to get registration key: %v", err)
226
-
return types.MergeCheckResponse{
227
-
Error: "failed to check merge status: this knot is unregistered",
231
-
ksClient, err := knotclient.NewSignedClient(f.Knot, secret, s.config.Core.Dev)
221
+
client, err := s.oauth.ServiceClient(
223
+
oauth.WithService(f.Knot),
224
+
oauth.WithLxm(tangled.RepoMergeCheckNSID),
225
+
oauth.WithDev(s.config.Core.Dev),
233
-
log.Printf("failed to setup signed client for %s; ignoring: %v", f.Knot, err)
228
+
log.Printf("failed to connect to knot server: %v", err)
return types.MergeCheckResponse{
235
-
Error: "failed to check merge status",
230
+
Error: "failed to check merge status: could not connect to knot server",
···
patch = mergeable.CombinedPatch()
249
-
resp, err := ksClient.MergeCheck([]byte(patch), f.OwnerDid(), f.Name, pull.TargetBranch)
251
-
log.Println("failed to check for mergeability:", err)
244
+
resp, xe := tangled.RepoMergeCheck(
247
+
&tangled.RepoMergeCheck_Input{
250
+
Branch: pull.TargetBranch,
254
+
if err := xrpcclient.HandleXrpcErr(xe); err != nil {
255
+
log.Println("failed to check for mergeability", "err", err)
return types.MergeCheckResponse{
253
-
Error: "failed to check merge status",
257
+
Error: fmt.Sprintf("failed to check merge status: %s", err.Error()),
256
-
switch resp.StatusCode {
258
-
return types.MergeCheckResponse{
259
-
Error: "failed to check merge status: this knot does not support PRs",
262
-
return types.MergeCheckResponse{
263
-
Error: "failed to check merge status: does this knot support PRs?",
261
+
// convert xrpc response to internal types
262
+
conflicts := make([]types.ConflictInfo, len(resp.Conflicts))
263
+
for i, conflict := range resp.Conflicts {
264
+
conflicts[i] = types.ConflictInfo{
265
+
Filename: conflict.Filename,
266
+
Reason: conflict.Reason,
267
-
respBody, err := io.ReadAll(resp.Body)
269
-
log.Println("failed to read merge check response body")
270
-
return types.MergeCheckResponse{
271
-
Error: "failed to check merge status: knot is not speaking the right language",
270
+
result := types.MergeCheckResponse{
271
+
IsConflicted: resp.Is_conflicted,
272
+
Conflicts: conflicts,
275
+
if resp.Message != nil {
276
+
result.Message = *resp.Message
274
-
defer resp.Body.Close()
276
-
var mergeCheckResponse types.MergeCheckResponse
277
-
err = json.Unmarshal(respBody, &mergeCheckResponse)
279
-
log.Println("failed to unmarshal merge check response", err)
280
-
return types.MergeCheckResponse{
281
-
Error: "failed to check merge status: knot is not speaking the right language",
279
+
if resp.Error != nil {
280
+
result.Error = *resp.Error
285
-
return mergeCheckResponse
func (s *Pulls) resubmitCheck(f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) pages.ResubmitResult {
···
870
-
secret, err := db.GetRegistrationKey(s.db, fork.Knot)
872
-
log.Println("failed to fetch registration key:", err)
873
-
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
877
-
sc, err := knotclient.NewSignedClient(fork.Knot, secret, s.config.Core.Dev)
868
+
client, err := s.oauth.ServiceClient(
870
+
oauth.WithService(fork.Knot),
871
+
oauth.WithLxm(tangled.RepoHiddenRefNSID),
872
+
oauth.WithDev(s.config.Core.Dev),
879
-
log.Println("failed to create signed client:", err)
875
+
log.Printf("failed to connect to knot server: %v", err)
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
···
891
-
resp, err := sc.NewHiddenRef(user.Did, fork.Name, sourceBranch, targetBranch)
887
+
resp, err := tangled.RepoHiddenRef(
890
+
&tangled.RepoHiddenRef_Input{
891
+
ForkRef: sourceBranch,
892
+
RemoteRef: targetBranch,
893
+
Repo: fork.RepoAt().String(),
893
-
log.Println("failed to create hidden ref:", err, resp.StatusCode)
894
-
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
897
+
xe, parseErr := xrpcerr.Unmarshal(err.Error())
898
+
if parseErr != nil {
899
+
log.Printf("failed to create hidden ref: %v", err)
900
+
s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
902
+
log.Printf("failed to create hidden ref: %s", xe.Error())
903
+
if xe.Tag == "AccessControl" {
904
+
s.pages.Notice(w, "pull", "Branch based pull requests are not supported on this knot.")
906
+
s.pages.Notice(w, "pull", fmt.Sprintf("Failed to create pull request: %s", xe.Message))
898
-
switch resp.StatusCode {
901
-
s.pages.Notice(w, "pull", "Branch based pull requests are not supported on this knot.")
913
+
errorMsg := "Failed to create pull request"
914
+
if resp.Error != nil {
915
+
errorMsg = fmt.Sprintf("Failed to create pull request: %s", *resp.Error)
917
+
s.pages.Notice(w, "pull", errorMsg)
···
1467
-
secret, err := db.GetRegistrationKey(s.db, forkRepo.Knot)
1469
-
log.Printf("failed to get registration key for %s: %s", forkRepo.Knot, err)
1470
-
s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
// update the hidden tracking branch to latest
1475
-
signedClient, err := knotclient.NewSignedClient(forkRepo.Knot, secret, s.config.Core.Dev)
1484
+
client, err := s.oauth.ServiceClient(
1486
+
oauth.WithService(forkRepo.Knot),
1487
+
oauth.WithLxm(tangled.RepoHiddenRefNSID),
1488
+
oauth.WithDev(s.config.Core.Dev),
1477
-
log.Printf("failed to create signed client for %s: %s", forkRepo.Knot, err)
1478
-
s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
1491
+
log.Printf("failed to connect to knot server: %v", err)
1482
-
resp, err := signedClient.NewHiddenRef(forkRepo.Did, forkRepo.Name, pull.PullSource.Branch, pull.TargetBranch)
1483
-
if err != nil || resp.StatusCode != http.StatusNoContent {
1484
-
log.Printf("failed to update tracking branch: %s", err)
1495
+
resp, err := tangled.RepoHiddenRef(
1498
+
&tangled.RepoHiddenRef_Input{
1499
+
ForkRef: pull.PullSource.Branch,
1500
+
RemoteRef: pull.TargetBranch,
1501
+
Repo: forkRepo.RepoAt().String(),
1504
+
if err != nil || !resp.Success {
1506
+
log.Printf("failed to update tracking branch: %s", err)
1508
+
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()
1911
-
secret, err := db.GetRegistrationKey(s.db, f.Knot)
1936
+
client, err := s.oauth.ServiceClient(
1938
+
oauth.WithService(f.Knot),
1939
+
oauth.WithLxm(tangled.RepoMergeNSID),
1940
+
oauth.WithDev(s.config.Core.Dev),
1913
-
log.Printf("no registration key found for domain %s: %s\n", f.Knot, err)
1943
+
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)
1930
-
ksClient, err := knotclient.NewSignedClient(f.Knot, secret, s.config.Core.Dev)
1932
-
log.Printf("failed to create signed client for %s: %s", f.Knot, err)
1933
-
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
1960
+
authorName := ident.Handle.String()
1961
+
mergeInput := &tangled.RepoMerge_Input{
1962
+
Did: f.OwnerDid(),
1964
+
Branch: pull.TargetBranch,
1966
+
CommitMessage: &pull.Title,
1967
+
AuthorName: &authorName,
1937
-
// Merge the pull request
1938
-
resp, err := ksClient.Merge([]byte(patch), f.OwnerDid(), f.Name, pull.TargetBranch, pull.Title, pull.Body, ident.Handle.String(), email.Address)
1970
+
if pull.Body != "" {
1971
+
mergeInput.CommitBody = &pull.Body
1974
+
if email.Address != "" {
1975
+
mergeInput.AuthorEmail = &email.Address
1978
+
client, err := s.oauth.ServiceClient(
1980
+
oauth.WithService(f.Knot),
1981
+
oauth.WithLxm(tangled.RepoMergeNSID),
1982
+
oauth.WithDev(s.config.Core.Dev),
1940
-
log.Printf("failed to merge pull request: %s", err)
1985
+
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.")
1945
-
if resp.StatusCode != http.StatusOK {
1946
-
log.Printf("knotserver returned non-OK status code for merge: %d", resp.StatusCode)
1947
-
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
1990
+
err = tangled.RepoMerge(r.Context(), client, mergeInput)
1991
+
if err := xrpcclient.HandleXrpcErr(err); err != nil {
1992
+
s.pages.Notice(w, "pull-merge-error", err.Error())