webui_commit.go

 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// CommitData contains data for rendering individual commit view.
14type CommitData struct {
15	RepoBaseData
16	Commit    *git.Commit
17	Diff      *git.Diff
18	ParentIDs []string
19}
20
21func repoCommit(w http.ResponseWriter, r *http.Request) {
22	ctx := r.Context()
23	logger := log.FromContext(ctx)
24	cfg := config.FromContext(ctx)
25	repo := proto.RepositoryFromContext(ctx)
26	vars := mux.Vars(r)
27	hash := vars["hash"]
28
29	gr, err := openRepository(repo)
30	if err != nil {
31		logger.Debug("failed to open repository", "repo", repo.Name(), "err", err)
32		renderInternalServerError(w, r)
33		return
34	}
35
36	commit, err := gr.CatFileCommit(hash)
37	if err != nil {
38		logger.Debug("failed to get commit", "repo", repo.Name(), "hash", hash, "err", err)
39		renderNotFound(w, r)
40		return
41	}
42
43	diff, err := gr.Diff(commit)
44	if err != nil {
45		logger.Debug("failed to get diff", "repo", repo.Name(), "hash", hash, "err", err)
46		renderInternalServerError(w, r)
47		return
48	}
49
50	defaultBranch := getDefaultBranch(gr)
51
52	parentIDs := make([]string, commit.ParentsCount())
53	for i := 0; i < commit.ParentsCount(); i++ {
54		parentID, err := commit.ParentID(i)
55		if err == nil && parentID != nil {
56			parentIDs[i] = parentID.String()
57		}
58	}
59
60	data := CommitData{
61		RepoBaseData: RepoBaseData{
62			BaseData: BaseData{
63				ServerName: cfg.Name,
64				ActiveTab:  "commits",
65			},
66			Repo:          repo,
67			DefaultBranch: defaultBranch,
68		},
69		Commit:    commit,
70		Diff:      diff,
71		ParentIDs: parentIDs,
72	}
73
74	renderHTML(w, "commit.html", data)
75}