package handlers import ( "fmt" "strings" "github.com/gofiber/fiber/v2" "polar/internal/web/middleware" ) // RepoForkSubmit creates a fork of the repository for the current user. func (h *Handler) RepoForkSubmit(c *fiber.Ctx) error { r, _, err := h.loadAuthorizedRepo(c, false) if err != nil { return nil } u := middleware.CurrentUser(c) if u == nil { return c.Redirect("/login", fiber.StatusSeeOther) } if u.ID == r.OwnerID { h.setFlashT(c, "flash.fork_self") return c.Redirect(fmt.Sprintf("/%s/%s", r.OwnerUsername, r.Name), fiber.StatusSeeOther) } if existing, _ := h.repoSvc.FindForkByOwner(c.UserContext(), r.ID, u.ID); existing != nil { h.setFlashT(c, "flash.fork_exists") return c.Redirect(fmt.Sprintf("/%s/%s", existing.OwnerUsername, existing.Name), fiber.StatusSeeOther) } name := strings.TrimSpace(c.FormValue("name")) newFork := r if r.ForkedFromRepoID != nil { if parent, parentErr := h.repoSvc.GetByID(c.UserContext(), *r.ForkedFromRepoID); parentErr == nil && parent != nil { newFork = parent } } fork, err := h.repoSvc.Fork(c.UserContext(), newFork, u, name) if err != nil { h.setFlashT(c, "flash.fork_failed", err.Error()) return c.Redirect(fmt.Sprintf("/%s/%s", r.OwnerUsername, r.Name), fiber.StatusSeeOther) } h.setFlashT(c, "flash.fork_created") return c.Redirect(fmt.Sprintf("/%s/%s", fork.OwnerUsername, fork.Name), fiber.StatusSeeOther) } // RepoForksPage lists all forks of the repository. func (h *Handler) RepoForksPage(c *fiber.Ctx) error { r, _, err := h.loadAuthorizedRepo(c, false) if err != nil { return nil } forks, _ := h.repoSvc.ListForks(c.UserContext(), r.ID, 100) var upstream map[string]string if r.ForkedFromRepoID != nil { upstream = map[string]string{"Owner": r.ForkedFromOwner, "Name": r.ForkedFromName} } viewer := middleware.CurrentUser(c) data := h.baseData(c, h.tr(c, "forks.title")+" ยท "+r.OwnerUsername+"/"+r.Name) data["Repo"] = r data["Ref"] = r.DefaultBranch data["ActiveTab"] = "code" data["CanWrite"] = h.repoSvc.CanWrite(c.UserContext(), r, viewer) data["CloneURL"] = h.cloneURL(c, r.OwnerUsername, r.Name) data["Forks"] = forks data["Upstream"] = upstream return h.render(c, fiber.StatusOK, "forks", data) }