back interdiff of round #1 and #0

appview: use less OwnerSlashRepo() in handlers #802

merged
opened by boltless.me targeting master from sl/yurolxtlpsmz
ERROR
appview/issues/issues.go

Failed to calculate interdiff for this file.

ERROR
appview/middleware/middleware.go

Failed to calculate interdiff for this file.

ERROR
appview/pages/repoinfo/repoinfo.go

Failed to calculate interdiff for this file.

ERROR
appview/pulls/pulls.go

Failed to calculate interdiff for this file.

ERROR
appview/repo/blob.go

Failed to calculate interdiff for this file.

ERROR
appview/repo/tree.go

Failed to calculate interdiff for this file.

ERROR
appview/reporesolver/resolver.go

Failed to calculate interdiff for this file.

NEW
appview/repo/artifact.go
···
Host: host,
}
-
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
xrpcBytes, err := tangled.RepoTags(ctx, xrpcc, "", 0, repo)
if err != nil {
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
···
Host: host,
}
+
repo := fmt.Sprintf("%s/%s", f.Did, f.Name)
xrpcBytes, err := tangled.RepoTags(ctx, xrpcc, "", 0, repo)
if err != nil {
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
NEW
appview/repo/branches.go
···
xrpcc := &indigoxrpc.Client{
Host: host,
}
-
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)
···
xrpcc := &indigoxrpc.Client{
Host: host,
}
+
repo := fmt.Sprintf("%s/%s", f.Did, 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)
NEW
appview/repo/compare.go
···
Host: host,
}
-
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)
···
Host: host,
}
-
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 {
···
Host: host,
}
+
repo := fmt.Sprintf("%s/%s", f.Did, 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)
···
Host: host,
}
+
repo := fmt.Sprintf("%s/%s", f.Did, f.Name)
branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo)
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
NEW
appview/repo/feed.go
···
"tangled.org/core/appview/db"
"tangled.org/core/appview/models"
"tangled.org/core/appview/pagination"
-
"tangled.org/core/appview/reporesolver"
"github.com/bluesky-social/indigo/atproto/syntax"
"github.com/gorilla/feeds"
)
-
func (rp *Repo) getRepoFeed(ctx context.Context, f *reporesolver.ResolvedRepo) (*feeds.Feed, error) {
const feedLimitPerType = 100
-
pulls, err := db.GetPullsWithLimit(rp.db, feedLimitPerType, db.FilterEq("repo_at", f.RepoAt()))
if err != nil {
return nil, err
}
···
issues, err := db.GetIssuesPaginated(
rp.db,
pagination.Page{Limit: feedLimitPerType},
-
db.FilterEq("repo_at", f.RepoAt()),
)
if err != nil {
return nil, err
}
feed := &feeds.Feed{
-
Title: fmt.Sprintf("activity feed for %s", f.OwnerSlashRepo()),
-
Link: &feeds.Link{Href: fmt.Sprintf("%s/%s", rp.config.Core.AppviewHost, f.OwnerSlashRepo()), Type: "text/html", Rel: "alternate"},
Items: make([]*feeds.Item, 0),
Updated: time.UnixMilli(0),
}
for _, pull := range pulls {
-
items, err := rp.createPullItems(ctx, pull, f)
if err != nil {
return nil, err
}
···
}
for _, issue := range issues {
-
item, err := rp.createIssueItem(ctx, issue, f)
if err != nil {
return nil, err
}
···
return feed, nil
}
-
func (rp *Repo) createPullItems(ctx context.Context, pull *models.Pull, f *reporesolver.ResolvedRepo) ([]*feeds.Item, error) {
owner, err := rp.idResolver.ResolveIdent(ctx, pull.OwnerDid)
if err != nil {
return nil, err
···
var items []*feeds.Item
state := rp.getPullState(pull)
-
description := rp.buildPullDescription(owner.Handle, state, pull, f.OwnerSlashRepo())
mainItem := &feeds.Item{
Title: fmt.Sprintf("[PR #%d] %s", pull.PullId, pull.Title),
Description: description,
-
Link: &feeds.Link{Href: fmt.Sprintf("%s/%s/pulls/%d", rp.config.Core.AppviewHost, f.OwnerSlashRepo(), pull.PullId)},
Created: pull.Created,
Author: &feeds.Author{Name: fmt.Sprintf("@%s", owner.Handle)},
}
···
roundItem := &feeds.Item{
Title: fmt.Sprintf("[PR #%d] %s (round #%d)", pull.PullId, pull.Title, round.RoundNumber),
-
Description: fmt.Sprintf("@%s submitted changes (at round #%d) on PR #%d in %s", owner.Handle, round.RoundNumber, pull.PullId, f.OwnerSlashRepo()),
-
Link: &feeds.Link{Href: fmt.Sprintf("%s/%s/pulls/%d/round/%d/", rp.config.Core.AppviewHost, f.OwnerSlashRepo(), pull.PullId, round.RoundNumber)},
Created: round.Created,
Author: &feeds.Author{Name: fmt.Sprintf("@%s", owner.Handle)},
}
···
return items, nil
}
-
func (rp *Repo) createIssueItem(ctx context.Context, issue models.Issue, f *reporesolver.ResolvedRepo) (*feeds.Item, error) {
owner, err := rp.idResolver.ResolveIdent(ctx, issue.Did)
if err != nil {
return nil, err
···
return &feeds.Item{
Title: fmt.Sprintf("[Issue #%d] %s", issue.IssueId, issue.Title),
-
Description: fmt.Sprintf("@%s %s issue #%d in %s", owner.Handle, state, issue.IssueId, f.OwnerSlashRepo()),
-
Link: &feeds.Link{Href: fmt.Sprintf("%s/%s/issues/%d", rp.config.Core.AppviewHost, f.OwnerSlashRepo(), issue.IssueId)},
Created: issue.Created,
Author: &feeds.Author{Name: fmt.Sprintf("@%s", owner.Handle)},
}, nil
···
log.Println("failed to fully resolve repo:", err)
return
}
-
feed, err := rp.getRepoFeed(r.Context(), f)
if err != nil {
log.Println("failed to get repo feed:", err)
rp.pages.Error500(w)
···
"tangled.org/core/appview/db"
"tangled.org/core/appview/models"
"tangled.org/core/appview/pagination"
+
"github.com/bluesky-social/indigo/atproto/identity"
"github.com/bluesky-social/indigo/atproto/syntax"
"github.com/gorilla/feeds"
)
+
func (rp *Repo) getRepoFeed(ctx context.Context, repo *models.Repo, ownerSlashRepo string) (*feeds.Feed, error) {
const feedLimitPerType = 100
+
pulls, err := db.GetPullsWithLimit(rp.db, feedLimitPerType, db.FilterEq("repo_at", repo.RepoAt()))
if err != nil {
return nil, err
}
···
issues, err := db.GetIssuesPaginated(
rp.db,
pagination.Page{Limit: feedLimitPerType},
+
db.FilterEq("repo_at", repo.RepoAt()),
)
if err != nil {
return nil, err
}
feed := &feeds.Feed{
+
Title: fmt.Sprintf("activity feed for @%s", ownerSlashRepo),
+
Link: &feeds.Link{Href: fmt.Sprintf("%s/%s", rp.config.Core.AppviewHost, ownerSlashRepo), Type: "text/html", Rel: "alternate"},
Items: make([]*feeds.Item, 0),
Updated: time.UnixMilli(0),
}
for _, pull := range pulls {
+
items, err := rp.createPullItems(ctx, pull, repo, ownerSlashRepo)
if err != nil {
return nil, err
}
···
}
for _, issue := range issues {
+
item, err := rp.createIssueItem(ctx, issue, repo, ownerSlashRepo)
if err != nil {
return nil, err
}
···
return feed, nil
}
+
func (rp *Repo) createPullItems(ctx context.Context, pull *models.Pull, repo *models.Repo, ownerSlashRepo string) ([]*feeds.Item, error) {
owner, err := rp.idResolver.ResolveIdent(ctx, pull.OwnerDid)
if err != nil {
return nil, err
···
var items []*feeds.Item
state := rp.getPullState(pull)
+
description := rp.buildPullDescription(owner.Handle, state, pull, ownerSlashRepo)
mainItem := &feeds.Item{
Title: fmt.Sprintf("[PR #%d] %s", pull.PullId, pull.Title),
Description: description,
+
Link: &feeds.Link{Href: fmt.Sprintf("%s/%s/pulls/%d", rp.config.Core.AppviewHost, ownerSlashRepo, pull.PullId)},
Created: pull.Created,
Author: &feeds.Author{Name: fmt.Sprintf("@%s", owner.Handle)},
}
···
roundItem := &feeds.Item{
Title: fmt.Sprintf("[PR #%d] %s (round #%d)", pull.PullId, pull.Title, round.RoundNumber),
+
Description: fmt.Sprintf("@%s submitted changes (at round #%d) on PR #%d in @%s", owner.Handle, round.RoundNumber, pull.PullId, ownerSlashRepo),
+
Link: &feeds.Link{Href: fmt.Sprintf("%s/%s/pulls/%d/round/%d/", rp.config.Core.AppviewHost, ownerSlashRepo, pull.PullId, round.RoundNumber)},
Created: round.Created,
Author: &feeds.Author{Name: fmt.Sprintf("@%s", owner.Handle)},
}
···
return items, nil
}
+
func (rp *Repo) createIssueItem(ctx context.Context, issue models.Issue, repo *models.Repo, ownerSlashRepo string) (*feeds.Item, error) {
owner, err := rp.idResolver.ResolveIdent(ctx, issue.Did)
if err != nil {
return nil, err
···
return &feeds.Item{
Title: fmt.Sprintf("[Issue #%d] %s", issue.IssueId, issue.Title),
+
Description: fmt.Sprintf("@%s %s issue #%d in @%s", owner.Handle, state, issue.IssueId, ownerSlashRepo),
+
Link: &feeds.Link{Href: fmt.Sprintf("%s/%s/issues/%d", rp.config.Core.AppviewHost, ownerSlashRepo, issue.IssueId)},
Created: issue.Created,
Author: &feeds.Author{Name: fmt.Sprintf("@%s", owner.Handle)},
}, nil
···
log.Println("failed to fully resolve repo:", err)
return
}
+
repoOwnerId, ok := r.Context().Value("resolvedId").(identity.Identity)
+
if !ok || repoOwnerId.Handle.IsInvalidHandle() {
+
log.Println("failed to get resolved repo owner id")
+
return
+
}
+
ownerSlashRepo := repoOwnerId.Handle.String() + "/" + f.Name
+
feed, err := rp.getRepoFeed(r.Context(), &f.Repo, ownerSlashRepo)
if err != nil {
log.Println("failed to get repo feed:", err)
rp.pages.Error500(w)
NEW
appview/repo/index.go
···
if err != nil || langs == nil {
// non-fatal, fetch langs from ks via XRPC
-
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
ls, err := tangled.RepoLanguages(ctx, xrpcc, currentRef, repo)
if err != nil {
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
···
// buildIndexResponse creates a RepoIndexResponse by combining multiple xrpc calls in parallel
func (rp *Repo) buildIndexResponse(ctx context.Context, xrpcc *indigoxrpc.Client, f *reporesolver.ResolvedRepo, ref string) (*types.RepoIndexResponse, error) {
-
repo := fmt.Sprintf("%s/%s", f.OwnerDid(), f.Name)
// first get branches to determine the ref if not specified
branchesBytes, err := tangled.RepoBranches(ctx, xrpcc, "", 0, repo)
···
if err != nil || langs == nil {
// non-fatal, fetch langs from ks via XRPC
+
repo := fmt.Sprintf("%s/%s", f.Did, f.Name)
ls, err := tangled.RepoLanguages(ctx, xrpcc, currentRef, repo)
if err != nil {
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
···
// buildIndexResponse creates a RepoIndexResponse by combining multiple xrpc calls in parallel
func (rp *Repo) buildIndexResponse(ctx context.Context, xrpcc *indigoxrpc.Client, f *reporesolver.ResolvedRepo, ref string) (*types.RepoIndexResponse, error) {
+
repo := fmt.Sprintf("%s/%s", f.Did, f.Name)
// first get branches to determine the ref if not specified
branchesBytes, err := tangled.RepoBranches(ctx, xrpcc, "", 0, repo)
NEW
appview/repo/log.go
···
cursor = strconv.Itoa(offset)
}
-
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)
···
Host: host,
}
-
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)
···
cursor = strconv.Itoa(offset)
}
+
repo := fmt.Sprintf("%s/%s", f.Did, 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)
···
Host: host,
}
+
repo := fmt.Sprintf("%s/%s", f.Did, 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)
NEW
appview/repo/repo.go
···
r.Context(),
client,
&tangled.RepoDelete_Input{
-
Did: f.OwnerDid(),
Name: f.Name,
Rkey: f.Rkey,
},
···
l.Info("removed collaborators")
// remove repo RBAC
-
err = rp.enforcer.RemoveRepo(f.OwnerDid(), f.Knot, f.DidSlashRepo())
if err != nil {
rp.pages.Notice(w, noticeId, "Failed to update RBAC rules")
return
}
// remove repo from db
-
err = db.RemoveRepo(tx, f.OwnerDid(), f.Name)
if err != nil {
rp.pages.Notice(w, noticeId, "Failed to update appview")
return
···
return
}
-
rp.pages.HxRedirect(w, fmt.Sprintf("/%s", f.OwnerDid()))
}
func (rp *Repo) SyncRepoFork(w http.ResponseWriter, r *http.Request) {
···
uri = "http"
}
-
forkSourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, f.Knot, f.OwnerDid(), f.Repo.Name)
l = l.With("cloneUrl", forkSourceUrl)
sourceAt := f.RepoAt().String()
···
r.Context(),
client,
&tangled.RepoDelete_Input{
+
Did: f.Did,
Name: f.Name,
Rkey: f.Rkey,
},
···
l.Info("removed collaborators")
// remove repo RBAC
+
err = rp.enforcer.RemoveRepo(f.Did, f.Knot, f.DidSlashRepo())
if err != nil {
rp.pages.Notice(w, noticeId, "Failed to update RBAC rules")
return
}
// remove repo from db
+
err = db.RemoveRepo(tx, f.Did, f.Name)
if err != nil {
rp.pages.Notice(w, noticeId, "Failed to update appview")
return
···
return
}
+
rp.pages.HxRedirect(w, fmt.Sprintf("/%s", f.Did))
}
func (rp *Repo) SyncRepoFork(w http.ResponseWriter, r *http.Request) {
···
uri = "http"
}
+
forkSourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, f.Knot, f.Did, f.Repo.Name)
l = l.With("cloneUrl", forkSourceUrl)
sourceAt := f.RepoAt().String()
NEW
appview/repo/settings.go
···
Host: host,
}
-
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)
···
user := rp.oauth.GetUser(r)
// all spindles that the repo owner is a member of
-
spindles, err := rp.enforcer.GetSpindlesForUser(f.OwnerDid())
if err != nil {
l.Error("failed to fetch spindles", "err", err)
return
···
Host: host,
}
+
repo := fmt.Sprintf("%s/%s", f.Did, 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)
···
user := rp.oauth.GetUser(r)
// all spindles that the repo owner is a member of
+
spindles, err := rp.enforcer.GetSpindlesForUser(f.Did)
if err != nil {
l.Error("failed to fetch spindles", "err", err)
return
NEW
appview/repo/tags.go
···
xrpcc := &indigoxrpc.Client{
Host: host,
}
-
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)
···
xrpcc := &indigoxrpc.Client{
Host: host,
}
+
repo := fmt.Sprintf("%s/%s", f.Did, 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)