1package web
2
3import (
4 "fmt"
5 "html/template"
6 "net/http"
7
8 "github.com/charmbracelet/log/v2"
9 "github.com/charmbracelet/soft-serve/pkg/backend"
10 "github.com/charmbracelet/soft-serve/pkg/config"
11 "github.com/charmbracelet/soft-serve/pkg/proto"
12 "github.com/charmbracelet/soft-serve/pkg/ui/common"
13)
14
15// OverviewData contains data for rendering repository overview page.
16type OverviewData struct {
17 RepoBaseData
18 IsEmpty bool
19 SSHURL string
20 HTTPURL string
21 ReadmeHTML template.HTML
22}
23
24// repoOverview handles repository overview page.
25func repoOverview(w http.ResponseWriter, r *http.Request) {
26 ctx := r.Context()
27 logger := log.FromContext(ctx)
28 repo := proto.RepositoryFromContext(ctx)
29 cfg := config.FromContext(ctx)
30
31 gr, err := openRepository(repo)
32 if err != nil {
33 logger.Debug("failed to open repository", "repo", repo.Name(), "err", err)
34 renderInternalServerError(w, r)
35 return
36 }
37
38 defaultBranch := getDefaultBranch(gr)
39 isEmpty := defaultBranch == ""
40
41 sshURL := common.RepoURL(cfg.SSH.PublicURL, repo.Name())
42 httpURL := fmt.Sprintf("%s/%s.git", cfg.HTTP.PublicURL, repo.Name())
43
44 var readmeHTML template.HTML
45 if !isEmpty {
46 head, _ := gr.HEAD()
47 readmeContent, _, err := backend.Readme(repo, head)
48 if err == nil && readmeContent != "" {
49 readmeHTML, _ = renderMarkdown([]byte(readmeContent))
50 }
51 }
52
53 data := OverviewData{
54 RepoBaseData: RepoBaseData{
55 BaseData: BaseData{
56 ServerName: cfg.Name,
57 ActiveTab: "overview",
58 },
59 Repo: repo,
60 DefaultBranch: defaultBranch,
61 },
62 IsEmpty: isEmpty,
63 SSHURL: sshURL,
64 HTTPURL: httpURL,
65 ReadmeHTML: readmeHTML,
66 }
67
68 renderHTML(w, "overview.html", data)
69}