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 Repo proto.Repository
18 DefaultBranch string
19 IsEmpty bool
20 SSHURL string
21 HTTPURL string
22 ActiveTab string
23 ReadmeHTML template.HTML
24 ServerName string
25}
26
27// repoOverview handles repository overview page.
28func repoOverview(w http.ResponseWriter, r *http.Request) {
29 ctx := r.Context()
30 logger := log.FromContext(ctx)
31 repo := proto.RepositoryFromContext(ctx)
32 cfg := config.FromContext(ctx)
33
34 gr, err := openRepository(repo)
35 if err != nil {
36 logger.Debug("failed to open repository", "repo", repo.Name(), "err", err)
37 renderInternalServerError(w, r)
38 return
39 }
40
41 defaultBranch := getDefaultBranch(gr)
42 isEmpty := defaultBranch == ""
43
44 sshURL := common.RepoURL(cfg.SSH.PublicURL, repo.Name())
45 httpURL := fmt.Sprintf("%s/%s.git", cfg.HTTP.PublicURL, repo.Name())
46
47 var readmeHTML template.HTML
48 if !isEmpty {
49 head, _ := gr.HEAD()
50 readmeContent, _, err := backend.Readme(repo, head)
51 if err == nil && readmeContent != "" {
52 readmeHTML, _ = renderMarkdown([]byte(readmeContent))
53 }
54 }
55
56 data := OverviewData{
57 Repo: repo,
58 DefaultBranch: defaultBranch,
59 IsEmpty: isEmpty,
60 SSHURL: sshURL,
61 HTTPURL: httpURL,
62 ActiveTab: "overview",
63 ReadmeHTML: readmeHTML,
64 ServerName: cfg.Name,
65 }
66
67 renderHTML(w, "overview.html", data)
68}