diff --git a/appview/pages/pages.go b/appview/pages/pages.go
index aa538f16..843eb54d 100644
--- a/appview/pages/pages.go
+++ b/appview/pages/pages.go
@@ -618,13 +618,14 @@ func (r ResubmitResult) Unknown() bool {
}
type RepoSinglePullParams struct {
- LoggedInUser *auth.User
- RepoInfo RepoInfo
- Active string
- DidHandleMap map[string]string
- Pull *db.Pull
- MergeCheck types.MergeCheckResponse
- ResubmitCheck ResubmitResult
+ LoggedInUser *auth.User
+ RepoInfo RepoInfo
+ Active string
+ DidHandleMap map[string]string
+ Pull *db.Pull
+ PullSourceRepo *db.Repo
+ MergeCheck types.MergeCheckResponse
+ ResubmitCheck ResubmitResult
}
func (p *Pages) RepoSinglePull(w io.Writer, params RepoSinglePullParams) error {
@@ -664,6 +665,25 @@ func (p *Pages) PullCompareBranchesFragment(w io.Writer, params PullCompareBranc
return p.executePlain("fragments/pullCompareBranches", w, params)
}
+type PullCompareForkParams struct {
+ RepoInfo RepoInfo
+ Forks []db.Repo
+}
+
+func (p *Pages) PullCompareForkFragment(w io.Writer, params PullCompareForkParams) error {
+ return p.executePlain("fragments/pullCompareForks", w, params)
+}
+
+type PullCompareForkBranchesParams struct {
+ RepoInfo RepoInfo
+ SourceBranches []types.Branch
+ TargetBranches []types.Branch
+}
+
+func (p *Pages) PullCompareForkBranchesFragment(w io.Writer, params PullCompareForkBranchesParams) error {
+ return p.executePlain("fragments/pullCompareForksBranches", w, params)
+}
+
type PullResubmitParams struct {
LoggedInUser *auth.User
RepoInfo RepoInfo
diff --git a/appview/pages/templates/fragments/pullCompareBranches.html b/appview/pages/templates/fragments/pullCompareBranches.html
index 862fa3d8..b7e6dd44 100644
--- a/appview/pages/templates/fragments/pullCompareBranches.html
+++ b/appview/pages/templates/fragments/pullCompareBranches.html
@@ -1,4 +1,5 @@
{{ define "fragments/pullCompareBranches" }}
+
@@ -28,18 +29,6 @@
{{ end }}
-
-
- ... or upload a patch
-
-
diff --git a/appview/pages/templates/fragments/pullCompareForks.html b/appview/pages/templates/fragments/pullCompareForks.html
new file mode 100644
index 00000000..71d82547
--- /dev/null
+++ b/appview/pages/templates/fragments/pullCompareForks.html
@@ -0,0 +1,35 @@
+{{ define "fragments/pullCompareForks" }}
+
+
+
+
+
+
+
+
+
+
+ Select a fork first to view available branches
+
+
+
+{{ end }}
diff --git a/appview/pages/templates/fragments/pullCompareForksBranches.html b/appview/pages/templates/fragments/pullCompareForksBranches.html
new file mode 100644
index 00000000..0d2cdfe6
--- /dev/null
+++ b/appview/pages/templates/fragments/pullCompareForksBranches.html
@@ -0,0 +1,31 @@
+{{ define "fragments/pullCompareForksBranches" }}
+
+
+
+ {{ i "move-left" "w-5 h-5" }}
+
+
+
+
+{{ end }}
diff --git a/appview/pages/templates/fragments/pullPatchUpload.html b/appview/pages/templates/fragments/pullPatchUpload.html
index f6965c27..f42d2aca 100644
--- a/appview/pages/templates/fragments/pullPatchUpload.html
+++ b/appview/pages/templates/fragments/pullPatchUpload.html
@@ -1,26 +1,14 @@
{{ define "fragments/pullPatchUpload" }}
-
-
-
-
- {{ if .RepoInfo.Roles.IsPushAllowed }}
-
- You can also submit a pull request from a branch.
-
+
+
- {{ end }}
-
{{ end }}
diff --git a/appview/pages/templates/repo/pulls/new.html b/appview/pages/templates/repo/pulls/new.html
index 9f97cdfc..29e3608c 100644
--- a/appview/pages/templates/repo/pulls/new.html
+++ b/appview/pages/templates/repo/pulls/new.html
@@ -35,16 +35,50 @@
>
- {{ if not .RepoInfo.Roles.IsPushAllowed }}
- {{ template "fragments/pullPatchUpload" . }}
- {{ else }}
- {{ template "fragments/pullCompareBranches" . }}
- {{ end }}
- Or, select a fork to create a pull request from.
+
+
+
+
+ {{ template "fragments/pullPatchUpload" . }}
+
-
+
diff --git a/appview/pages/templates/repo/pulls/pull.html b/appview/pages/templates/repo/pulls/pull.html
index 1a1e0cb3..8878ab0c 100644
--- a/appview/pages/templates/repo/pulls/pull.html
+++ b/appview/pages/templates/repo/pulls/pull.html
@@ -42,19 +42,16 @@
targeting
- {{ .Pull.TargetBranch }}
+ {{ .Pull.TargetBranch }}
{{ if not .Pull.IsPatch }}
from
{{ if not .Pull.IsSameRepoBranch }}
-
- {{ .Pull.PullSource.Repo }}
-
- /
+ {{ $owner }}/{{ .PullSourceRepo.Name }}
{{ end }}
- {{ .Pull.PullSource.Branch }}
+ {{ .Pull.PullSource.Branch }}
{{ end }}
diff --git a/appview/state/pull.go b/appview/state/pull.go
index 983b8167..73bcad32 100644
--- a/appview/state/pull.go
+++ b/appview/state/pull.go
@@ -120,13 +120,25 @@ func (s *State) RepoSinglePull(w http.ResponseWriter, r *http.Request) {
resubmitResult = s.resubmitCheck(f, pull)
}
+ var pullSourceRepo *db.Repo
+ if pull.PullSource != nil {
+ if pull.PullSource.Repo != nil {
+ pullSourceRepo, err = db.GetRepoByAtUri(s.db, pull.PullSource.Repo.String())
+ if err != nil {
+ log.Printf("failed to get repo by at uri: %v", err)
+ return
+ }
+ }
+ }
+
s.pages.RepoSinglePull(w, pages.RepoSinglePullParams{
- LoggedInUser: user,
- RepoInfo: f.RepoInfo(s, user),
- DidHandleMap: didHandleMap,
- Pull: pull,
- MergeCheck: mergeCheckResponse,
- ResubmitCheck: resubmitResult,
+ LoggedInUser: user,
+ RepoInfo: f.RepoInfo(s, user),
+ DidHandleMap: didHandleMap,
+ Pull: pull,
+ PullSourceRepo: pullSourceRepo,
+ MergeCheck: mergeCheckResponse,
+ ResubmitCheck: resubmitResult,
})
}
@@ -533,7 +545,7 @@ func (s *State) NewPull(w http.ResponseWriter, r *http.Request) {
title := r.FormValue("title")
body := r.FormValue("body")
targetBranch := r.FormValue("targetBranch")
- fromFork := r.FormValue("fromFork")
+ fromFork := r.FormValue("fork")
sourceBranch := r.FormValue("sourceBranch")
patch := r.FormValue("patch")
@@ -843,6 +855,105 @@ func (s *State) CompareBranchesFragment(w http.ResponseWriter, r *http.Request)
})
}
+func (s *State) CompareForksFragment(w http.ResponseWriter, r *http.Request) {
+ user := s.auth.GetUser(r)
+ f, err := fullyResolvedRepo(r)
+ if err != nil {
+ log.Println("failed to get repo and knot", err)
+ return
+ }
+
+ forks, err := db.GetForksByDid(s.db, user.Did)
+ if err != nil {
+ log.Println("failed to get forks", err)
+ return
+ }
+
+ s.pages.PullCompareForkFragment(w, pages.PullCompareForkParams{
+ RepoInfo: f.RepoInfo(s, user),
+ Forks: forks,
+ })
+}
+
+func (s *State) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Request) {
+ user := s.auth.GetUser(r)
+
+ f, err := fullyResolvedRepo(r)
+ if err != nil {
+ log.Println("failed to get repo and knot", err)
+ return
+ }
+
+ forkVal := r.URL.Query().Get("fork")
+
+ // fork repo
+ repo, err := db.GetRepo(s.db, user.Did, forkVal)
+ if err != nil {
+ log.Println("failed to get repo", user.Did, forkVal)
+ return
+ }
+
+ sourceBranchesClient, err := NewUnsignedClient(repo.Knot, s.config.Dev)
+ if err != nil {
+ log.Printf("failed to create unsigned client for %s", repo.Knot)
+ s.pages.Error503(w)
+ return
+ }
+
+ sourceResp, err := sourceBranchesClient.Branches(user.Did, repo.Name)
+ if err != nil {
+ log.Println("failed to reach knotserver for source branches", err)
+ return
+ }
+
+ sourceBody, err := io.ReadAll(sourceResp.Body)
+ if err != nil {
+ log.Println("failed to read source response body", err)
+ return
+ }
+ defer sourceResp.Body.Close()
+
+ var sourceResult types.RepoBranchesResponse
+ err = json.Unmarshal(sourceBody, &sourceResult)
+ if err != nil {
+ log.Println("failed to parse source branches response:", err)
+ return
+ }
+
+ targetBranchesClient, err := NewUnsignedClient(f.Knot, s.config.Dev)
+ if err != nil {
+ log.Printf("failed to create unsigned client for target knot %s", f.Knot)
+ s.pages.Error503(w)
+ return
+ }
+
+ targetResp, err := targetBranchesClient.Branches(f.OwnerDid(), f.RepoName)
+ if err != nil {
+ log.Println("failed to reach knotserver for target branches", err)
+ return
+ }
+
+ targetBody, err := io.ReadAll(targetResp.Body)
+ if err != nil {
+ log.Println("failed to read target response body", err)
+ return
+ }
+ defer targetResp.Body.Close()
+
+ var targetResult types.RepoBranchesResponse
+ err = json.Unmarshal(targetBody, &targetResult)
+ if err != nil {
+ log.Println("failed to parse target branches response:", err)
+ return
+ }
+
+ s.pages.PullCompareForkBranchesFragment(w, pages.PullCompareForkBranchesParams{
+ RepoInfo: f.RepoInfo(s, user),
+ SourceBranches: sourceResult.Branches,
+ TargetBranches: targetResult.Branches,
+ })
+}
+
func (s *State) ResubmitPull(w http.ResponseWriter, r *http.Request) {
user := s.auth.GetUser(r)
f, err := fullyResolvedRepo(r)
diff --git a/appview/state/router.go b/appview/state/router.go
index a7822318..58a57a9e 100644
--- a/appview/state/router.go
+++ b/appview/state/router.go
@@ -97,6 +97,8 @@ func (s *State) UserRouter() http.Handler {
r.Get("/", s.NewPull)
r.Get("/patch-upload", s.PatchUploadFragment)
r.Get("/compare-branches", s.CompareBranchesFragment)
+ r.Get("/compare-forks", s.CompareForksFragment)
+ r.Get("/fork-branches", s.CompareForksBranchesFragment)
r.Post("/", s.NewPull)
})