···
···
func (rp *Repo) DownloadArchive(w http.ResponseWriter, r *http.Request) {
ref := chi.URLParam(r, "ref")
ref, _ = url.PathUnescape(ref)
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
archiveBytes, err := tangled.RepoArchive(r.Context(), xrpcc, "tar.gz", "", ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.archive", xrpcerr)
···
func (rp *Repo) RepoLog(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to fully resolve repo", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoLog(r.Context(), xrpcc, cursor, limit, "", ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.log", xrpcerr)
var xrpcResp types.RepoLogResponse
if err := json.Unmarshal(xrpcBytes, &xrpcResp); err != nil {
-
log.Println("failed to decode XRPC response", err)
tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.tags", xrpcerr)
···
branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.branches", xrpcerr)
···
emailToDidMap, err := db.GetEmailToDid(rp.db, uniqueEmails(xrpcResp.Commits), true)
-
log.Println("failed to fetch email to did mapping", err)
vc, err := commitverify.GetVerifiedObjectCommits(rp.db, emailToDidMap, xrpcResp.Commits)
repoInfo := f.RepoInfo(user)
···
pipelines, err := getPipelineStatuses(rp.db, repoInfo, shas)
···
func (rp *Repo) RepoDescriptionEdit(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
w.WriteHeader(http.StatusBadRequest)
···
func (rp *Repo) RepoDescription(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
w.WriteHeader(http.StatusBadRequest)
···
rkey := repoAt.RecordKey().String()
-
log.Println("invalid aturi for repo", err)
w.WriteHeader(http.StatusInternalServerError)
···
newDescription := r.FormValue("description")
client, err := rp.oauth.AuthorizedClient(r)
-
log.Println("failed to get client")
rp.pages.Notice(w, "repo-notice", "Failed to update description, try again later.")
···
err = db.UpdateDescription(rp.db, string(repoAt), newDescription)
-
log.Println("failed to perferom update-description query", err)
rp.pages.Notice(w, "repo-notice", "Failed to update description, try again later.")
···
-
log.Println("failed to perferom update-description query", err)
rp.pages.Notice(w, "repo-notice", "Failed to update description, unable to save to PDS.")
···
func (rp *Repo) RepoCommit(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to fully resolve repo", err)
ref := chi.URLParam(r, "ref")
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoDiff(r.Context(), xrpcc, ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.diff", xrpcerr)
var result types.RepoCommitResponse
if err := json.Unmarshal(xrpcBytes, &result); err != nil {
-
log.Println("failed to decode XRPC response", err)
emailToDidMap, err := db.GetEmailToDid(rp.db, []string{result.Diff.Commit.Committer.Email, result.Diff.Commit.Author.Email}, true)
-
log.Println("failed to get email to did mapping:", err)
vc, err := commitverify.GetVerifiedCommits(rp.db, emailToDidMap, []types.NiceDiff{*result.Diff})
user := rp.oauth.GetUser(r)
repoInfo := f.RepoInfo(user)
pipelines, err := getPipelineStatuses(rp.db, repoInfo, []string{result.Diff.Commit.This})
var pipeline *models.Pipeline
···
func (rp *Repo) RepoTree(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to fully resolve repo", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcResp, err := tangled.RepoTree(r.Context(), xrpcc, treePath, ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.tree", xrpcerr)
···
func (rp *Repo) RepoTags(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.tags", xrpcerr)
var result types.RepoTagsResponse
if err := json.Unmarshal(xrpcBytes, &result); err != nil {
-
log.Println("failed to decode XRPC response", err)
artifacts, err := db.GetArtifact(rp.db, db.FilterEq("repo_at", f.RepoAt()))
-
log.Println("failed grab artifacts", err)
···
func (rp *Repo) RepoBranches(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.branches", xrpcerr)
var result types.RepoBranchesResponse
if err := json.Unmarshal(xrpcBytes, &result); err != nil {
-
log.Println("failed to decode XRPC response", err)
···
func (rp *Repo) DeleteBranch(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
noticeId := "delete-branch-error"
fail := func(msg string, err error) {
-
log.Println(msg, "err", err)
rp.pages.Notice(w, noticeId, msg)
···
fail(fmt.Sprintf("Failed to delete branch: %s", err), err)
-
log.Println("deleted branch from knot", "branch", branch, "repo", f.RepoAt())
func (rp *Repo) RepoBlob(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Repo.Name)
resp, err := tangled.RepoBlob(r.Context(), xrpcc, filePath, false, ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.blob", xrpcerr)
···
func (rp *Repo) RepoBlobRaw(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
w.WriteHeader(http.StatusBadRequest)
···
req, err := http.NewRequest("GET", blobURL, nil)
-
log.Println("failed to create request", err)
···
resp, err := client.Do(req)
-
log.Println("failed to reach knotserver", err)
···
if resp.StatusCode != http.StatusOK {
-
log.Printf("knotserver returned non-OK status for raw blob %s: %d", blobURL, resp.StatusCode)
w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
···
contentType := resp.Header.Get("Content-Type")
body, err := io.ReadAll(resp.Body)
-
log.Printf("error reading response body from knotserver: %v", err)
w.WriteHeader(http.StatusInternalServerError)
···
db.FilterContains("scope", subject.Collection().String()),
-
log.Println("failed to fetch label defs", err)
···
states, err := db.GetLabels(rp.db, db.FilterEq("subject", subject))
-
log.Println("failed to build label state", err)
···
db.FilterContains("scope", subject.Collection().String()),
-
log.Println("failed to fetch labels", err)
···
states, err := db.GetLabels(rp.db, db.FilterEq("subject", subject))
-
log.Println("failed to build label state", err)
···
func (rp *Repo) DeleteRepo(w http.ResponseWriter, r *http.Request) {
user := rp.oauth.GetUser(r)
noticeId := "operation-error"
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
// remove record from pds
atpClient, err := rp.oauth.AuthorizedClient(r)
-
log.Println("failed to get authorized client", err)
_, err = comatproto.RepoDeleteRecord(r.Context(), atpClient, &comatproto.RepoDeleteRecord_Input{
···
-
log.Printf("failed to delete record: %s", err)
rp.pages.Notice(w, noticeId, "Failed to delete repository from PDS.")
-
log.Println("removed repo record ", f.RepoAt().String())
client, err := rp.oauth.ServiceClient(
···
oauth.WithDev(rp.config.Core.Dev),
-
log.Println("failed to connect to knot server:", err)
···
rp.pages.Notice(w, noticeId, err.Error())
-
log.Println("deleted repo from knot")
tx, err := rp.db.BeginTx(r.Context(), nil)
-
log.Println("failed to start tx")
w.Write(fmt.Append(nil, "failed to add collaborator: ", err))
···
err = rp.enforcer.E.LoadPolicy()
-
log.Println("failed to rollback policies")
···
rp.enforcer.RemoveCollaborator(did, f.Knot, f.DidSlashRepo())
-
log.Println("removed collaborators")
err = rp.enforcer.RemoveRepo(f.OwnerDid(), f.Knot, f.DidSlashRepo())
···
rp.pages.Notice(w, noticeId, "Failed to update appview")
-
log.Println("removed repo from db")
-
log.Println("failed to commit changes", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
err = rp.enforcer.E.SavePolicy()
-
log.Println("failed to update ACLs", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
···
func (rp *Repo) SetDefaultBranch(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
···
oauth.WithDev(rp.config.Core.Dev),
-
log.Println("failed to connect to knot server:", err)
rp.pages.Notice(w, noticeId, "Failed to connect to knot server.")
···
if err := xrpcclient.HandleXrpcErr(xe); err != nil {
-
log.Println("xrpc failed", "err", xe)
rp.pages.Notice(w, noticeId, err.Error())
···
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
-
log.Println("empty spindle cannot add/rm secret", err)
···
oauth.WithDev(rp.config.Core.Dev),
-
log.Println("failed to create spindle client", err)
···
func (rp *Repo) generalSettings(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
user := rp.oauth.GetUser(r)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.branches", xrpcerr)
var result types.RepoBranchesResponse
if err := json.Unmarshal(xrpcBytes, &result); err != nil {
-
log.Println("failed to decode XRPC response", err)
defaultLabels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", models.DefaultLabelDefs()))
-
log.Println("failed to fetch labels", err)
labels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", f.Repo.Labels))
-
log.Println("failed to fetch labels", err)
···
func (rp *Repo) accessSettings(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
user := rp.oauth.GetUser(r)
repoCollaborators, err := f.Collaborators(r.Context())
-
log.Println("failed to get collaborators", err)
rp.pages.RepoAccessSettings(w, pages.RepoAccessSettingsParams{
···
func (rp *Repo) pipelineSettings(w http.ResponseWriter, r *http.Request) {
f, err := rp.repoResolver.Resolve(r)
user := rp.oauth.GetUser(r)
// all spindles that the repo owner is a member of
spindles, err := rp.enforcer.GetSpindlesForUser(f.OwnerDid())
-
log.Println("failed to fetch spindles", err)
···
oauth.WithDev(rp.config.Core.Dev),
-
log.Println("failed to create spindle client", err)
} else if resp, err := tangled.RepoListSecrets(r.Context(), spindleClient, f.RepoAt().String()); err != nil {
-
log.Println("failed to fetch secrets", err)
···
func (rp *Repo) SyncRepoFork(w http.ResponseWriter, r *http.Request) {
ref := chi.URLParam(r, "ref")
ref, _ = url.PathUnescape(ref)
user := rp.oauth.GetUser(r)
f, err := rp.repoResolver.Resolve(r)
-
log.Printf("failed to resolve source repo: %v", err)
···
func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) {
user := rp.oauth.GetUser(r)
f, err := rp.repoResolver.Resolve(r)
-
log.Printf("failed to resolve source repo: %v", err)
···
if !errors.Is(err, sql.ErrNoRows) {
-
log.Println("error fetching existing repo from db", "err", err)
rp.pages.Notice(w, "repo", "Failed to fork this repository. Try again later.")
···
err = db.AddRepo(tx, repo)
rp.pages.Notice(w, "repo", "Failed to save repository information.")
···
p, _ := securejoin.SecureJoin(user.Did, forkName)
err = rp.enforcer.AddRepo(user.Did, targetKnot, p)
rp.pages.Notice(w, "repo", "Failed to set up repository permissions.")
-
log.Println("failed to commit changes", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
err = rp.enforcer.E.SavePolicy()
-
log.Println("failed to update ACLs", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
···
func (rp *Repo) RepoCompareNew(w http.ResponseWriter, r *http.Request) {
user := rp.oauth.GetUser(r)
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.branches", xrpcerr)
var branchResult types.RepoBranchesResponse
if err := json.Unmarshal(branchBytes, &branchResult); err != nil {
-
log.Println("failed to decode XRPC branches response", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")
···
tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.tags", xrpcerr)
var tags types.RepoTagsResponse
if err := json.Unmarshal(tagBytes, &tags); err != nil {
-
log.Println("failed to decode XRPC tags response", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")
···
func (rp *Repo) RepoCompare(w http.ResponseWriter, r *http.Request) {
user := rp.oauth.GetUser(r)
f, err := rp.repoResolver.Resolve(r)
-
log.Println("failed to get repo and knot", err)
···
head, _ = url.PathUnescape(head)
if base == "" || head == "" {
-
log.Printf("invalid comparison")
···
branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.branches", xrpcerr)
var branches types.RepoBranchesResponse
if err := json.Unmarshal(branchBytes, &branches); err != nil {
-
log.Println("failed to decode XRPC branches response", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")
tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.tags", xrpcerr)
var tags types.RepoTagsResponse
if err := json.Unmarshal(tagBytes, &tags); err != nil {
-
log.Println("failed to decode XRPC tags response", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")
compareBytes, err := tangled.RepoCompare(r.Context(), xrpcc, repo, base, head)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
-
log.Println("failed to call XRPC repo.compare", xrpcerr)
var formatPatch types.RepoFormatPatchResponse
if err := json.Unmarshal(compareBytes, &formatPatch); err != nil {
-
log.Println("failed to decode XRPC compare response", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")
···
···
func (rp *Repo) DownloadArchive(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "DownloadArchive")
ref := chi.URLParam(r, "ref")
ref, _ = url.PathUnescape(ref)
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
archiveBytes, err := tangled.RepoArchive(r.Context(), xrpcc, "tar.gz", "", ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.archive", "err", xrpcerr)
···
func (rp *Repo) RepoLog(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoLog")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to fully resolve repo", "err", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoLog(r.Context(), xrpcc, cursor, limit, "", ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.log", "err", xrpcerr)
var xrpcResp types.RepoLogResponse
if err := json.Unmarshal(xrpcBytes, &xrpcResp); err != nil {
+
l.Error("failed to decode XRPC response", "err", err)
tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.tags", "err", xrpcerr)
···
branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.branches", "err", xrpcerr)
···
emailToDidMap, err := db.GetEmailToDid(rp.db, uniqueEmails(xrpcResp.Commits), true)
+
l.Error("failed to fetch email to did mapping", "err", err)
vc, err := commitverify.GetVerifiedObjectCommits(rp.db, emailToDidMap, xrpcResp.Commits)
+
l.Error("failed to GetVerifiedObjectCommits", "err", err)
repoInfo := f.RepoInfo(user)
···
pipelines, err := getPipelineStatuses(rp.db, repoInfo, shas)
+
l.Error("failed to getPipelineStatuses", "err", err)
···
func (rp *Repo) RepoDescriptionEdit(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoDescriptionEdit")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
w.WriteHeader(http.StatusBadRequest)
···
func (rp *Repo) RepoDescription(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoDescription")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
w.WriteHeader(http.StatusBadRequest)
···
rkey := repoAt.RecordKey().String()
+
l.Error("invalid aturi for repo", "err", err)
w.WriteHeader(http.StatusInternalServerError)
···
newDescription := r.FormValue("description")
client, err := rp.oauth.AuthorizedClient(r)
+
l.Error("failed to get client")
rp.pages.Notice(w, "repo-notice", "Failed to update description, try again later.")
···
err = db.UpdateDescription(rp.db, string(repoAt), newDescription)
+
l.Error("failed to perform update-description query", "err", err)
rp.pages.Notice(w, "repo-notice", "Failed to update description, try again later.")
···
+
l.Error("failed to perferom update-description query", "err", err)
rp.pages.Notice(w, "repo-notice", "Failed to update description, unable to save to PDS.")
···
func (rp *Repo) RepoCommit(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoCommit")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to fully resolve repo", "err", err)
ref := chi.URLParam(r, "ref")
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoDiff(r.Context(), xrpcc, ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.diff", "err", xrpcerr)
var result types.RepoCommitResponse
if err := json.Unmarshal(xrpcBytes, &result); err != nil {
+
l.Error("failed to decode XRPC response", "err", err)
emailToDidMap, err := db.GetEmailToDid(rp.db, []string{result.Diff.Commit.Committer.Email, result.Diff.Commit.Author.Email}, true)
+
l.Error("failed to get email to did mapping", "err", err)
vc, err := commitverify.GetVerifiedCommits(rp.db, emailToDidMap, []types.NiceDiff{*result.Diff})
+
l.Error("failed to GetVerifiedCommits", "err", err)
user := rp.oauth.GetUser(r)
repoInfo := f.RepoInfo(user)
pipelines, err := getPipelineStatuses(rp.db, repoInfo, []string{result.Diff.Commit.This})
+
l.Error("failed to getPipelineStatuses", "err", err)
var pipeline *models.Pipeline
···
func (rp *Repo) RepoTree(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoTree")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to fully resolve repo", "err", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcResp, err := tangled.RepoTree(r.Context(), xrpcc, treePath, ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.tree", "err", xrpcerr)
···
func (rp *Repo) RepoTags(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoTags")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.tags", "err", xrpcerr)
var result types.RepoTagsResponse
if err := json.Unmarshal(xrpcBytes, &result); err != nil {
+
l.Error("failed to decode XRPC response", "err", err)
artifacts, err := db.GetArtifact(rp.db, db.FilterEq("repo_at", f.RepoAt()))
+
l.Error("failed grab artifacts", "err", err)
···
func (rp *Repo) RepoBranches(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoBranches")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.branches", "err", xrpcerr)
var result types.RepoBranchesResponse
if err := json.Unmarshal(xrpcBytes, &result); err != nil {
+
l.Error("failed to decode XRPC response", "err", err)
···
func (rp *Repo) DeleteBranch(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "DeleteBranch")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
noticeId := "delete-branch-error"
fail := func(msg string, err error) {
+
l.Error(msg, "err", err)
rp.pages.Notice(w, noticeId, msg)
···
fail(fmt.Sprintf("Failed to delete branch: %s", err), err)
+
l.Error("deleted branch from knot", "branch", branch, "repo", f.RepoAt())
func (rp *Repo) RepoBlob(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoBlob")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Repo.Name)
resp, err := tangled.RepoBlob(r.Context(), xrpcc, filePath, false, ref, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.blob", "err", xrpcerr)
···
func (rp *Repo) RepoBlobRaw(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoBlobRaw")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", err)
w.WriteHeader(http.StatusBadRequest)
···
req, err := http.NewRequest("GET", blobURL, nil)
+
l.Error("failed to create request", "err", err)
···
resp, err := client.Do(req)
+
l.Error("failed to reach knotserver", "err", err)
···
if resp.StatusCode != http.StatusOK {
+
l.Error("knotserver returned non-OK status for raw blob", "url", blobURL, "statuscode", resp.StatusCode)
w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
···
contentType := resp.Header.Get("Content-Type")
body, err := io.ReadAll(resp.Body)
+
l.Error("error reading response body from knotserver", "err", err)
w.WriteHeader(http.StatusInternalServerError)
···
db.FilterContains("scope", subject.Collection().String()),
+
l.Error("failed to fetch label defs", "err", err)
···
states, err := db.GetLabels(rp.db, db.FilterEq("subject", subject))
+
l.Error("failed to build label state", "err", err)
···
db.FilterContains("scope", subject.Collection().String()),
+
l.Error("failed to fetch labels", "err", err)
···
states, err := db.GetLabels(rp.db, db.FilterEq("subject", subject))
+
l.Error("failed to build label state", "err", err)
···
func (rp *Repo) DeleteRepo(w http.ResponseWriter, r *http.Request) {
user := rp.oauth.GetUser(r)
+
l := rp.logger.With("handler", "DeleteRepo")
noticeId := "operation-error"
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
// remove record from pds
atpClient, err := rp.oauth.AuthorizedClient(r)
+
l.Error("failed to get authorized client", "err", err)
_, err = comatproto.RepoDeleteRecord(r.Context(), atpClient, &comatproto.RepoDeleteRecord_Input{
···
+
l.Error("failed to delete record", "err", err)
rp.pages.Notice(w, noticeId, "Failed to delete repository from PDS.")
+
l.Info("removed repo record", "aturi", f.RepoAt().String())
client, err := rp.oauth.ServiceClient(
···
oauth.WithDev(rp.config.Core.Dev),
+
l.Error("failed to connect to knot server", "err", err)
···
rp.pages.Notice(w, noticeId, err.Error())
+
l.Info("deleted repo from knot")
tx, err := rp.db.BeginTx(r.Context(), nil)
+
l.Error("failed to start tx")
w.Write(fmt.Append(nil, "failed to add collaborator: ", err))
···
err = rp.enforcer.E.LoadPolicy()
+
l.Error("failed to rollback policies")
···
rp.enforcer.RemoveCollaborator(did, f.Knot, f.DidSlashRepo())
+
l.Info("removed collaborators")
err = rp.enforcer.RemoveRepo(f.OwnerDid(), f.Knot, f.DidSlashRepo())
···
rp.pages.Notice(w, noticeId, "Failed to update appview")
+
l.Info("removed repo from db")
+
l.Error("failed to commit changes", "err", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
err = rp.enforcer.E.SavePolicy()
+
l.Error("failed to update ACLs", "err", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
···
func (rp *Repo) SetDefaultBranch(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "SetDefaultBranch")
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
···
oauth.WithDev(rp.config.Core.Dev),
+
l.Error("failed to connect to knot server", "err", err)
rp.pages.Notice(w, noticeId, "Failed to connect to knot server.")
···
if err := xrpcclient.HandleXrpcErr(xe); err != nil {
+
l.Error("xrpc failed", "err", xe)
rp.pages.Notice(w, noticeId, err.Error())
···
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
+
l.Error("empty spindle cannot add/rm secret", "err", err)
···
oauth.WithDev(rp.config.Core.Dev),
+
l.Error("failed to create spindle client", "err", err)
···
func (rp *Repo) generalSettings(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "generalSettings")
f, err := rp.repoResolver.Resolve(r)
user := rp.oauth.GetUser(r)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.branches", "err", xrpcerr)
var result types.RepoBranchesResponse
if err := json.Unmarshal(xrpcBytes, &result); err != nil {
+
l.Error("failed to decode XRPC response", "err", err)
defaultLabels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", models.DefaultLabelDefs()))
+
l.Error("failed to fetch labels", "err", err)
labels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", f.Repo.Labels))
+
l.Error("failed to fetch labels", "err", err)
···
func (rp *Repo) accessSettings(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "accessSettings")
f, err := rp.repoResolver.Resolve(r)
user := rp.oauth.GetUser(r)
repoCollaborators, err := f.Collaborators(r.Context())
+
l.Error("failed to get collaborators", "err", err)
rp.pages.RepoAccessSettings(w, pages.RepoAccessSettingsParams{
···
func (rp *Repo) pipelineSettings(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "pipelineSettings")
f, err := rp.repoResolver.Resolve(r)
user := rp.oauth.GetUser(r)
// all spindles that the repo owner is a member of
spindles, err := rp.enforcer.GetSpindlesForUser(f.OwnerDid())
+
l.Error("failed to fetch spindles", "err", err)
···
oauth.WithDev(rp.config.Core.Dev),
+
l.Error("failed to create spindle client", "err", err)
} else if resp, err := tangled.RepoListSecrets(r.Context(), spindleClient, f.RepoAt().String()); err != nil {
+
l.Error("failed to fetch secrets", "err", err)
···
func (rp *Repo) SyncRepoFork(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "SyncRepoFork")
ref := chi.URLParam(r, "ref")
ref, _ = url.PathUnescape(ref)
user := rp.oauth.GetUser(r)
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to resolve source repo", "err", err)
···
func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "ForkRepo")
user := rp.oauth.GetUser(r)
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to resolve source repo", "err", err)
···
if !errors.Is(err, sql.ErrNoRows) {
+
l.Error("error fetching existing repo from db", "err", err)
rp.pages.Notice(w, "repo", "Failed to fork this repository. Try again later.")
···
err = db.AddRepo(tx, repo)
+
l.Error("failed to AddRepo", "err", err)
rp.pages.Notice(w, "repo", "Failed to save repository information.")
···
p, _ := securejoin.SecureJoin(user.Did, forkName)
err = rp.enforcer.AddRepo(user.Did, targetKnot, p)
+
l.Error("failed to add ACLs", "err", err)
rp.pages.Notice(w, "repo", "Failed to set up repository permissions.")
+
l.Error("failed to commit changes", "err", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
err = rp.enforcer.E.SavePolicy()
+
l.Error("failed to update ACLs", "err", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
···
func (rp *Repo) RepoCompareNew(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoCompareNew")
user := rp.oauth.GetUser(r)
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
···
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.branches", "err", xrpcerr)
var branchResult types.RepoBranchesResponse
if err := json.Unmarshal(branchBytes, &branchResult); err != nil {
+
l.Error("failed to decode XRPC branches response", "err", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")
···
tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.tags", "err", xrpcerr)
var tags types.RepoTagsResponse
if err := json.Unmarshal(tagBytes, &tags); err != nil {
+
l.Error("failed to decode XRPC tags response", "err", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")
···
func (rp *Repo) RepoCompare(w http.ResponseWriter, r *http.Request) {
+
l := rp.logger.With("handler", "RepoCompare")
user := rp.oauth.GetUser(r)
f, err := rp.repoResolver.Resolve(r)
+
l.Error("failed to get repo and knot", "err", err)
···
head, _ = url.PathUnescape(head)
if base == "" || head == "" {
+
l.Error("invalid comparison")
···
branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.branches", "err", xrpcerr)
var branches types.RepoBranchesResponse
if err := json.Unmarshal(branchBytes, &branches); err != nil {
+
l.Error("failed to decode XRPC branches response", "err", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")
tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.tags", "err", xrpcerr)
var tags types.RepoTagsResponse
if err := json.Unmarshal(tagBytes, &tags); err != nil {
+
l.Error("failed to decode XRPC tags response", "err", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")
compareBytes, err := tangled.RepoCompare(r.Context(), xrpcc, repo, base, head)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
l.Error("failed to call XRPC repo.compare", "err", xrpcerr)
var formatPatch types.RepoFormatPatchResponse
if err := json.Unmarshal(compareBytes, &formatPatch); err != nil {
+
l.Error("failed to decode XRPC compare response", "err", err)
rp.pages.Notice(w, "compare-error", "Failed to produce comparison. Try again later.")