1package web
2
3import (
4 "net/http"
5
6 "github.com/charmbracelet/log/v2"
7 "github.com/charmbracelet/soft-serve/git"
8 "github.com/charmbracelet/soft-serve/pkg/config"
9 "github.com/charmbracelet/soft-serve/pkg/proto"
10 "github.com/gorilla/mux"
11)
12
13// TreeData contains data for rendering directory tree view.
14type TreeData struct {
15 RepoBaseData
16 Ref string
17 Path string
18 Entries git.Entries
19 IsCommitHash bool
20}
21
22func repoTree(w http.ResponseWriter, r *http.Request) {
23 ctx := r.Context()
24 logger := log.FromContext(ctx)
25 cfg := config.FromContext(ctx)
26 repo := proto.RepositoryFromContext(ctx)
27 if repo == nil {
28 renderNotFound(w, r)
29 return
30 }
31
32 gr, err := openRepository(repo)
33 if err != nil {
34 logger.Debug("failed to open repository", "repo", repo.Name(), "err", err)
35 renderInternalServerError(w, r)
36 return
37 }
38
39 vars := mux.Vars(r)
40 refAndPath := vars["refAndPath"]
41 ref, path := parseRefAndPath(gr, refAndPath)
42
43 if ref == "" {
44 head, err := gr.HEAD()
45 if err == nil && head != nil {
46 ref = head.Name().Short()
47 }
48 }
49
50 refObj, isCommitHash, err := resolveAndBuildRef(gr, ref)
51 if err != nil {
52 logger.Debug("failed to resolve ref or commit", "repo", repo.Name(), "ref", ref, "err", err)
53 renderNotFound(w, r)
54 return
55 }
56
57 tree, err := gr.TreePath(refObj, path)
58 if err != nil {
59 logger.Debug("failed to get tree path", "repo", repo.Name(), "ref", ref, "path", path, "err", err)
60 renderNotFound(w, r)
61 return
62 }
63
64 entries, err := tree.Entries()
65 if err != nil {
66 logger.Debug("failed to get tree entries", "err", err)
67 renderInternalServerError(w, r)
68 return
69 }
70
71 entries.Sort()
72
73 defaultBranch := getDefaultBranch(gr)
74
75 data := TreeData{
76 RepoBaseData: RepoBaseData{
77 BaseData: BaseData{
78 ServerName: cfg.Name,
79 ActiveTab: "tree",
80 },
81 Repo: repo,
82 DefaultBranch: defaultBranch,
83 },
84 Ref: ref,
85 Path: path,
86 Entries: entries,
87 IsCommitHash: isCommitHash,
88 }
89
90 renderHTML(w, "tree.html", data)
91}