diff --git a/appview/models/pull.go b/appview/models/pull.go
index 39a7dcbb..3902e100 100644
--- a/appview/models/pull.go
+++ b/appview/models/pull.go
@@ -350,3 +350,8 @@ func (stack Stack) Mergeable() Stack {
return mergeable
}
+
+type BranchDeleteStatus struct {
+ Repo *Repo
+ Branch string
+}
diff --git a/appview/pages/pages.go b/appview/pages/pages.go
index 2ee42728..ad3b248b 100644
--- a/appview/pages/pages.go
+++ b/appview/pages/pages.go
@@ -1129,15 +1129,16 @@ func (r ResubmitResult) Unknown() bool {
}
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
@@ -1233,13 +1234,14 @@ func (p *Pages) PullResubmitFragment(w io.Writer, params PullResubmitParams) err
}
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 {
diff --git a/appview/pages/templates/repo/pulls/fragments/pullActions.html b/appview/pages/templates/repo/pulls/fragments/pullActions.html
index e98b3d83..2963e10a 100644
--- a/appview/pages/templates/repo/pulls/fragments/pullActions.html
+++ b/appview/pages/templates/repo/pulls/fragments/pullActions.html
@@ -33,6 +33,17 @@
comment
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
+ {{ if .BranchDeleteStatus }}
+
+ {{ end }}
{{ if and $isPushAllowed $isOpen $isLastRound }}
{{ $disabled := "" }}
{{ if $isConflicted }}
diff --git a/appview/pages/templates/repo/pulls/pull.html b/appview/pages/templates/repo/pulls/pull.html
index ac207223..fc149546 100644
--- a/appview/pages/templates/repo/pulls/pull.html
+++ b/appview/pages/templates/repo/pulls/pull.html
@@ -187,7 +187,16 @@
{{ 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 }}
diff --git a/appview/pulls/pulls.go b/appview/pulls/pulls.go
index 64c368cc..3f7c2e8b 100644
--- a/appview/pulls/pulls.go
+++ b/appview/pulls/pulls.go
@@ -98,19 +98,21 @@ func (s *Pulls) PullActions(w http.ResponseWriter, r *http.Request) {
}
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
}
@@ -153,6 +155,7 @@ func (s *Pulls) RepoSinglePull(w http.ResponseWriter, r *http.Request) {
}
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)
@@ -217,14 +220,15 @@ func (s *Pulls) RepoSinglePull(w http.ResponseWriter, r *http.Request) {
}
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,
@@ -301,6 +305,50 @@ func (s *Pulls) mergeCheck(r *http.Request, f *reporesolver.ResolvedRepo, pull *
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