appview/pulls: show "delete branch" button for merged PRs #645

merged
opened by oppi.li targeting master from push-rvtqynpmozzy
Changed files
+107 -32
appview
models
pages
templates
repo
pulls
pulls
+5
appview/models/pull.go
···
return mergeable
}
+
+
type BranchDeleteStatus struct {
+
Repo *Repo
+
Branch string
+
}
+18 -16
appview/pages/pages.go
···
type RepoSinglePullParams struct {
-
LoggedInUser *oauth.User
-
RepoInfo repoinfo.RepoInfo
-
Active string
-
Pull *models.Pull
-
Stack models.Stack
-
AbandonedPulls []*models.Pull
-
MergeCheck types.MergeCheckResponse
-
ResubmitCheck ResubmitResult
-
Pipelines map[string]models.Pipeline
+
LoggedInUser *oauth.User
+
RepoInfo repoinfo.RepoInfo
+
Active string
+
Pull *models.Pull
+
Stack models.Stack
+
AbandonedPulls []*models.Pull
+
BranchDeleteStatus *models.BranchDeleteStatus
+
MergeCheck types.MergeCheckResponse
+
ResubmitCheck ResubmitResult
+
Pipelines map[string]models.Pipeline
OrderedReactionKinds []models.ReactionKind
Reactions map[models.ReactionKind]models.ReactionDisplayData
···
type PullActionsParams struct {
-
LoggedInUser *oauth.User
-
RepoInfo repoinfo.RepoInfo
-
Pull *models.Pull
-
RoundNumber int
-
MergeCheck types.MergeCheckResponse
-
ResubmitCheck ResubmitResult
-
Stack models.Stack
+
LoggedInUser *oauth.User
+
RepoInfo repoinfo.RepoInfo
+
Pull *models.Pull
+
RoundNumber int
+
MergeCheck types.MergeCheckResponse
+
ResubmitCheck ResubmitResult
+
BranchDeleteStatus *models.BranchDeleteStatus
+
Stack models.Stack
func (p *Pages) PullActionsFragment(w io.Writer, params PullActionsParams) error {
+11
appview/pages/templates/repo/pulls/fragments/pullActions.html
···
<span>comment</span>
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
</button>
+
{{ if .BranchDeleteStatus }}
+
<button
+
hx-delete="/{{ .BranchDeleteStatus.Repo.Did }}/{{ .BranchDeleteStatus.Repo.Name }}/branches"
+
hx-vals='{"branch": "{{ .BranchDeleteStatus.Branch }}" }'
+
hx-swap="none"
+
class="btn p-2 flex items-center gap-2 no-underline hover:no-underline group text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300">
+
{{ i "git-branch" "w-4 h-4" }}
+
<span>delete branch</span>
+
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
+
</button>
+
{{ end }}
{{ if and $isPushAllowed $isOpen $isLastRound }}
{{ $disabled := "" }}
{{ if $isConflicted }}
+10 -1
appview/pages/templates/repo/pulls/pull.html
···
{{ end }}
{{ if $.LoggedInUser }}
-
{{ template "repo/pulls/fragments/pullActions" (dict "LoggedInUser" $.LoggedInUser "Pull" $.Pull "RepoInfo" $.RepoInfo "RoundNumber" .RoundNumber "MergeCheck" $.MergeCheck "ResubmitCheck" $.ResubmitCheck "Stack" $.Stack) }}
+
{{ template "repo/pulls/fragments/pullActions"
+
(dict
+
"LoggedInUser" $.LoggedInUser
+
"Pull" $.Pull
+
"RepoInfo" $.RepoInfo
+
"RoundNumber" .RoundNumber
+
"MergeCheck" $.MergeCheck
+
"ResubmitCheck" $.ResubmitCheck
+
"BranchDeleteStatus" $.BranchDeleteStatus
+
"Stack" $.Stack) }}
{{ else }}
<div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm p-2 relative flex gap-2 items-center w-fit">
<a href="/signup" class="btn-create py-0 hover:no-underline hover:text-white flex items-center gap-2">
+63 -15
appview/pulls/pulls.go
···
}
mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
+
branchDeleteStatus := s.branchDeleteStatus(r, f, pull)
resubmitResult := pages.Unknown
if user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(r, f, pull, stack)
}
s.pages.PullActionsFragment(w, pages.PullActionsParams{
-
LoggedInUser: user,
-
RepoInfo: f.RepoInfo(user),
-
Pull: pull,
-
RoundNumber: roundNumber,
-
MergeCheck: mergeCheckResponse,
-
ResubmitCheck: resubmitResult,
-
Stack: stack,
+
LoggedInUser: user,
+
RepoInfo: f.RepoInfo(user),
+
Pull: pull,
+
RoundNumber: roundNumber,
+
MergeCheck: mergeCheckResponse,
+
ResubmitCheck: resubmitResult,
+
BranchDeleteStatus: branchDeleteStatus,
+
Stack: stack,
})
return
}
···
}
mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
+
branchDeleteStatus := s.branchDeleteStatus(r, f, pull)
resubmitResult := pages.Unknown
if user != nil && user.Did == pull.OwnerDid {
resubmitResult = s.resubmitCheck(r, f, pull, stack)
···
}
s.pages.RepoSinglePull(w, pages.RepoSinglePullParams{
-
LoggedInUser: user,
-
RepoInfo: repoInfo,
-
Pull: pull,
-
Stack: stack,
-
AbandonedPulls: abandonedPulls,
-
MergeCheck: mergeCheckResponse,
-
ResubmitCheck: resubmitResult,
-
Pipelines: m,
+
LoggedInUser: user,
+
RepoInfo: repoInfo,
+
Pull: pull,
+
Stack: stack,
+
AbandonedPulls: abandonedPulls,
+
BranchDeleteStatus: branchDeleteStatus,
+
MergeCheck: mergeCheckResponse,
+
ResubmitCheck: resubmitResult,
+
Pipelines: m,
OrderedReactionKinds: models.OrderedReactionKinds,
Reactions: reactionMap,
···
return result
}
+
func (s *Pulls) branchDeleteStatus(r *http.Request, f *reporesolver.ResolvedRepo, pull *models.Pull) *models.BranchDeleteStatus {
+
if pull.State != models.PullMerged {
+
return nil
+
}
+
+
user := s.oauth.GetUser(r)
+
if user == nil {
+
return nil
+
}
+
+
var branch string
+
var repo *models.Repo
+
// check if the branch exists
+
// NOTE: appview could cache branches/tags etc. for every repo by listening for gitRefUpdates
+
if pull.IsBranchBased() {
+
branch = pull.PullSource.Branch
+
repo = &f.Repo
+
} else if pull.IsForkBased() {
+
branch = pull.PullSource.Branch
+
repo = pull.PullSource.Repo
+
} else {
+
return nil
+
}
+
+
scheme := "http"
+
if !s.config.Core.Dev {
+
scheme = "https"
+
}
+
host := fmt.Sprintf("%s://%s", scheme, repo.Knot)
+
xrpcc := &indigoxrpc.Client{
+
Host: host,
+
}
+
+
resp, err := tangled.RepoBranch(r.Context(), xrpcc, branch, fmt.Sprintf("%s/%s", repo.Did, repo.Name))
+
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
+
return nil
+
}
+
+
return &models.BranchDeleteStatus{
+
Repo: repo,
+
Branch: resp.Name,
+
}
+
}
+
func (s *Pulls) resubmitCheck(r *http.Request, f *reporesolver.ResolvedRepo, pull *models.Pull, stack models.Stack) pages.ResubmitResult {
if pull.State == models.PullMerged || pull.State == models.PullDeleted || pull.PullSource == nil {
return pages.Unknown