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) })