rin
Публичный Open-source lightweight git hosting.
forks.go · 77 строк · 2.2 KB
Raw
1 package handlers
2
3 import (
4 "fmt"
5 "strings"
6
7 "github.com/gofiber/fiber/v2"
8
9 "polar/internal/web/middleware"
10 )
11
12 // RepoForkSubmit creates a fork of the repository for the current user.
13 func (h *Handler) RepoForkSubmit(c *fiber.Ctx) error {
14 r, _, err := h.loadAuthorizedRepo(c, false)
15 if err != nil {
16 return nil
17 }
18
19 u := middleware.CurrentUser(c)
20 if u == nil {
21 return c.Redirect("/login", fiber.StatusSeeOther)
22 }
23
24 if u.ID == r.OwnerID {
25 h.setFlashT(c, "flash.fork_self")
26 return c.Redirect(fmt.Sprintf("/%s/%s", r.OwnerUsername, r.Name), fiber.StatusSeeOther)
27 }
28
29 if existing, _ := h.repoSvc.FindForkByOwner(c.UserContext(), r.ID, u.ID); existing != nil {
30 h.setFlashT(c, "flash.fork_exists")
31 return c.Redirect(fmt.Sprintf("/%s/%s", existing.OwnerUsername, existing.Name), fiber.StatusSeeOther)
32 }
33
34 name := strings.TrimSpace(c.FormValue("name"))
35 newFork := r
36 if r.ForkedFromRepoID != nil {
37 if parent, parentErr := h.repoSvc.GetByID(c.UserContext(), *r.ForkedFromRepoID); parentErr == nil && parent != nil {
38 newFork = parent
39 }
40 }
41
42 fork, err := h.repoSvc.Fork(c.UserContext(), newFork, u, name)
43 if err != nil {
44 h.setFlashT(c, "flash.fork_failed", err.Error())
45 return c.Redirect(fmt.Sprintf("/%s/%s", r.OwnerUsername, r.Name), fiber.StatusSeeOther)
46 }
47
48 h.setFlashT(c, "flash.fork_created")
49 return c.Redirect(fmt.Sprintf("/%s/%s", fork.OwnerUsername, fork.Name), fiber.StatusSeeOther)
50 }
51
52 // RepoForksPage lists all forks of the repository.
53 func (h *Handler) RepoForksPage(c *fiber.Ctx) error {
54 r, _, err := h.loadAuthorizedRepo(c, false)
55 if err != nil {
56 return nil
57 }
58
59 forks, _ := h.repoSvc.ListForks(c.UserContext(), r.ID, 100)
60
61 var upstream map[string]string
62 if r.ForkedFromRepoID != nil {
63 upstream = map[string]string{"Owner": r.ForkedFromOwner, "Name": r.ForkedFromName}
64 }
65
66 viewer := middleware.CurrentUser(c)
67 data := h.baseData(c, h.tr(c, "forks.title")+" · "+r.OwnerUsername+"/"+r.Name)
68 data["Repo"] = r
69 data["Ref"] = r.DefaultBranch
70 data["ActiveTab"] = "code"
71 data["CanWrite"] = h.repoSvc.CanWrite(c.UserContext(), r, viewer)
72 data["CloneURL"] = h.cloneURL(c, r.OwnerUsername, r.Name)
73 data["Forks"] = forks
74 data["Upstream"] = upstream
75
76 return h.render(c, fiber.StatusOK, "forks", data)
77 }
78