+3
-1
appview/pages/templates/repo/settings/general.html
+3
-1
appview/pages/templates/repo/settings/general.html
···
8
<div class="col-span-1 md:col-span-3 flex flex-col gap-6 p-2">
9
{{ template "branchSettings" . }}
10
{{ template "deleteRepo" . }}
11
</div>
12
</section>
13
{{ end }}
···
22
unless you specify a different branch.
23
</p>
24
</div>
25
-
<form hx-put="/{{ $.RepoInfo.FullName }}/settings/branches/default" class="col-span-1 md:col-span-1 md:justify-self-end group flex gap-2 items-stretch">
26
<select id="branch" name="branch" required class="p-1 max-w-64 border border-gray-200 bg-white dark:bg-gray-800 dark:text-white dark:border-gray-700">
27
<option value="" disabled selected >
28
Choose a default branch
···
54
<button
55
class="btn group text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 flex gap-2 items-center"
56
type="button"
57
hx-delete="/{{ $.RepoInfo.FullName }}/settings/delete"
58
hx-confirm="Are you sure you want to delete {{ $.RepoInfo.FullName }}?">
59
{{ i "trash-2" "size-4" }}
···
8
<div class="col-span-1 md:col-span-3 flex flex-col gap-6 p-2">
9
{{ template "branchSettings" . }}
10
{{ template "deleteRepo" . }}
11
+
<div id="operation-error" class="text-red-500 dark:text-red-400"></div>
12
</div>
13
</section>
14
{{ end }}
···
23
unless you specify a different branch.
24
</p>
25
</div>
26
+
<form hx-put="/{{ $.RepoInfo.FullName }}/settings/branches/default" hx-swap="none" class="col-span-1 md:col-span-1 md:justify-self-end group flex gap-2 items-stretch">
27
<select id="branch" name="branch" required class="p-1 max-w-64 border border-gray-200 bg-white dark:bg-gray-800 dark:text-white dark:border-gray-700">
28
<option value="" disabled selected >
29
Choose a default branch
···
55
<button
56
class="btn group text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 flex gap-2 items-center"
57
type="button"
58
+
hx-swap="none"
59
hx-delete="/{{ $.RepoInfo.FullName }}/settings/delete"
60
hx-confirm="Are you sure you want to delete {{ $.RepoInfo.FullName }}?">
61
{{ i "trash-2" "size-4" }}
+19
-43
appview/pulls/pulls.go
+19
-43
appview/pulls/pulls.go
···
19
"tangled.sh/tangled.sh/core/appview/pages"
20
"tangled.sh/tangled.sh/core/appview/pages/markup"
21
"tangled.sh/tangled.sh/core/appview/reporesolver"
22
"tangled.sh/tangled.sh/core/idresolver"
23
"tangled.sh/tangled.sh/core/knotclient"
24
"tangled.sh/tangled.sh/core/patchutil"
···
28
"github.com/bluekeyes/go-gitdiff/gitdiff"
29
comatproto "github.com/bluesky-social/indigo/api/atproto"
30
lexutil "github.com/bluesky-social/indigo/lex/util"
31
"github.com/go-chi/chi/v5"
32
"github.com/google/uuid"
33
)
···
218
return types.MergeCheckResponse{}
219
}
220
221
-
client, err := s.oauth.ServiceClient(
222
-
r,
223
-
oauth.WithService(f.Knot),
224
-
oauth.WithLxm(tangled.RepoMergeCheckNSID),
225
-
oauth.WithDev(s.config.Core.Dev),
226
-
)
227
-
if err != nil {
228
-
log.Printf("failed to connect to knot server: %v", err)
229
-
return types.MergeCheckResponse{
230
-
Error: "failed to check merge status: could not connect to knot server",
231
-
}
232
}
233
234
patch := pull.LatestPatch()
···
893
Repo: fork.RepoAt().String(),
894
},
895
)
896
-
if err != nil {
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.")
901
-
} else {
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.")
905
-
} else {
906
-
s.pages.Notice(w, "pull", fmt.Sprintf("Failed to create pull request: %s", xe.Message))
907
-
}
908
-
}
909
return
910
}
911
···
1501
Repo: forkRepo.RepoAt().String(),
1502
},
1503
)
1504
-
if err != nil || !resp.Success {
1505
-
if err != nil {
1506
-
log.Printf("failed to update tracking branch: %s", err)
1507
-
} else {
1508
-
log.Printf("failed to update tracking branch: success=false")
1509
-
}
1510
-
s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
1511
return
1512
}
1513
···
1932
}
1933
1934
patch := pullsToMerge.CombinedPatch()
1935
-
1936
-
client, err := s.oauth.ServiceClient(
1937
-
r,
1938
-
oauth.WithService(f.Knot),
1939
-
oauth.WithLxm(tangled.RepoMergeNSID),
1940
-
oauth.WithDev(s.config.Core.Dev),
1941
-
)
1942
-
if err != nil {
1943
-
log.Printf("failed to connect to knot server: %v", err)
1944
-
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
1945
-
return
1946
-
}
1947
1948
ident, err := s.idResolver.ResolveIdent(r.Context(), pull.OwnerDid)
1949
if err != nil {
···
19
"tangled.sh/tangled.sh/core/appview/pages"
20
"tangled.sh/tangled.sh/core/appview/pages/markup"
21
"tangled.sh/tangled.sh/core/appview/reporesolver"
22
+
"tangled.sh/tangled.sh/core/appview/xrpcclient"
23
"tangled.sh/tangled.sh/core/idresolver"
24
"tangled.sh/tangled.sh/core/knotclient"
25
"tangled.sh/tangled.sh/core/patchutil"
···
29
"github.com/bluekeyes/go-gitdiff/gitdiff"
30
comatproto "github.com/bluesky-social/indigo/api/atproto"
31
lexutil "github.com/bluesky-social/indigo/lex/util"
32
+
indigoxrpc "github.com/bluesky-social/indigo/xrpc"
33
"github.com/go-chi/chi/v5"
34
"github.com/google/uuid"
35
)
···
220
return types.MergeCheckResponse{}
221
}
222
223
+
scheme := "https"
224
+
if s.config.Core.Dev {
225
+
scheme = "http"
226
+
}
227
+
host := fmt.Sprintf("%s://%s", scheme, f.Knot)
228
+
229
+
xrpcc := indigoxrpc.Client{
230
+
Host: host,
231
}
232
233
patch := pull.LatestPatch()
···
892
Repo: fork.RepoAt().String(),
893
},
894
)
895
+
if err := xrpcclient.HandleXrpcErr(err); err != nil {
896
+
s.pages.Notice(w, "pull", err.Error())
897
return
898
}
899
···
1489
Repo: forkRepo.RepoAt().String(),
1490
},
1491
)
1492
+
if err := xrpcclient.HandleXrpcErr(err); err != nil {
1493
+
s.pages.Notice(w, "resubmit-error", err.Error())
1494
+
return
1495
+
}
1496
+
if !resp.Success {
1497
+
log.Println("Failed to update tracking ref.", "err", resp.Error)
1498
+
s.pages.Notice(w, "resubmit-error", "Failed to update tracking ref.")
1499
return
1500
}
1501
···
1920
}
1921
1922
patch := pullsToMerge.CombinedPatch()
1923
1924
ident, err := s.idResolver.ResolveIdent(r.Context(), pull.OwnerDid)
1925
if err != nil {
+13
-24
appview/repo/repo.go
+13
-24
appview/repo/repo.go
···
930
func (rp *Repo) DeleteRepo(w http.ResponseWriter, r *http.Request) {
931
user := rp.oauth.GetUser(r)
932
933
f, err := rp.repoResolver.Resolve(r)
934
if err != nil {
935
log.Println("failed to get repo and knot", err)
···
949
})
950
if err != nil {
951
log.Printf("failed to delete record: %s", err)
952
-
rp.pages.Notice(w, "settings-delete", "Failed to delete repository from PDS.")
953
return
954
}
955
log.Println("removed repo record ", f.RepoAt().String())
···
973
Name: f.Name,
974
},
975
)
976
-
if err != nil {
977
-
xe, parseErr := xrpcerr.Unmarshal(err.Error())
978
-
if parseErr != nil {
979
-
log.Printf("failed to delete repo from knot %s: %s", f.Knot, err)
980
-
} else {
981
-
log.Printf("failed to delete repo from knot %s: %s", f.Knot, xe.Error())
982
-
}
983
-
// Continue anyway since we want to clean up local state
984
-
} else {
985
-
log.Println("removed repo from knot ", f.Knot)
986
}
987
988
tx, err := rp.db.BeginTx(r.Context(), nil)
989
if err != nil {
···
1002
// remove collaborator RBAC
1003
repoCollaborators, err := rp.enforcer.E.GetImplicitUsersForResourceByDomain(f.DidSlashRepo(), f.Knot)
1004
if err != nil {
1005
-
rp.pages.Notice(w, "settings-delete", "Failed to remove collaborators")
1006
return
1007
}
1008
for _, c := range repoCollaborators {
···
1014
// remove repo RBAC
1015
err = rp.enforcer.RemoveRepo(f.OwnerDid(), f.Knot, f.DidSlashRepo())
1016
if err != nil {
1017
-
rp.pages.Notice(w, "settings-delete", "Failed to update RBAC rules")
1018
return
1019
}
1020
1021
// remove repo from db
1022
err = db.RemoveRepo(tx, f.OwnerDid(), f.Name)
1023
if err != nil {
1024
-
rp.pages.Notice(w, "settings-delete", "Failed to update appview")
1025
return
1026
}
1027
log.Println("removed repo from db")
···
1050
return
1051
}
1052
1053
branch := r.FormValue("branch")
1054
if branch == "" {
1055
http.Error(w, "malformed form", http.StatusBadRequest)
···
1082
return
1083
}
1084
1085
-
w.Write(fmt.Append(nil, "default branch set to: ", branch))
1086
}
1087
1088
func (rp *Repo) Secrets(w http.ResponseWriter, r *http.Request) {
···
1344
Branch: ref,
1345
},
1346
)
1347
-
if err != nil {
1348
-
xe, parseErr := xrpcerr.Unmarshal(err.Error())
1349
-
if parseErr != nil {
1350
-
log.Printf("failed to sync repository fork: %s", err)
1351
-
rp.pages.Notice(w, "repo", "Failed to sync repository fork.")
1352
-
} else {
1353
-
log.Printf("failed to sync repository fork: %s", xe.Error())
1354
-
rp.pages.Notice(w, "repo", fmt.Sprintf("Failed to sync repository fork: %s", xe.Message))
1355
-
}
1356
return
1357
}
1358
···
930
func (rp *Repo) DeleteRepo(w http.ResponseWriter, r *http.Request) {
931
user := rp.oauth.GetUser(r)
932
933
+
noticeId := "operation-error"
934
f, err := rp.repoResolver.Resolve(r)
935
if err != nil {
936
log.Println("failed to get repo and knot", err)
···
950
})
951
if err != nil {
952
log.Printf("failed to delete record: %s", err)
953
+
rp.pages.Notice(w, noticeId, "Failed to delete repository from PDS.")
954
return
955
}
956
log.Println("removed repo record ", f.RepoAt().String())
···
974
Name: f.Name,
975
},
976
)
977
+
if err := xrpcclient.HandleXrpcErr(err); err != nil {
978
+
rp.pages.Notice(w, noticeId, err.Error())
979
+
return
980
}
981
+
log.Println("deleted repo from knot")
982
983
tx, err := rp.db.BeginTx(r.Context(), nil)
984
if err != nil {
···
997
// remove collaborator RBAC
998
repoCollaborators, err := rp.enforcer.E.GetImplicitUsersForResourceByDomain(f.DidSlashRepo(), f.Knot)
999
if err != nil {
1000
+
rp.pages.Notice(w, noticeId, "Failed to remove collaborators")
1001
return
1002
}
1003
for _, c := range repoCollaborators {
···
1009
// remove repo RBAC
1010
err = rp.enforcer.RemoveRepo(f.OwnerDid(), f.Knot, f.DidSlashRepo())
1011
if err != nil {
1012
+
rp.pages.Notice(w, noticeId, "Failed to update RBAC rules")
1013
return
1014
}
1015
1016
// remove repo from db
1017
err = db.RemoveRepo(tx, f.OwnerDid(), f.Name)
1018
if err != nil {
1019
+
rp.pages.Notice(w, noticeId, "Failed to update appview")
1020
return
1021
}
1022
log.Println("removed repo from db")
···
1045
return
1046
}
1047
1048
+
noticeId := "operation-error"
1049
branch := r.FormValue("branch")
1050
if branch == "" {
1051
http.Error(w, "malformed form", http.StatusBadRequest)
···
1078
return
1079
}
1080
1081
+
rp.pages.HxRefresh(w)
1082
}
1083
1084
func (rp *Repo) Secrets(w http.ResponseWriter, r *http.Request) {
···
1340
Branch: ref,
1341
},
1342
)
1343
+
if err := xrpcclient.HandleXrpcErr(err); err != nil {
1344
+
rp.pages.Notice(w, "repo", err.Error())
1345
return
1346
}
1347