all repos — elgit @ 6a6fbe78d84d9d93d1ea88e480188c31fc40bc0b

fork of legit: web frontend for git, written in go

templates/commit.go (view raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package templates

import (
	"fmt"

	"github.com/bluekeyes/go-gitdiff/gitdiff"
	"go.alanpearce.eu/elgit/git"
	g "go.alanpearce.eu/gomponents"
	. "go.alanpearce.eu/gomponents/html"
)

// Commit renders a commit diff page
func Commit(data PageData, diff *git.NiceDiff) g.Node {
	return Page(data, []g.Node{
		RepoHeader(data),
		RenderNav(data),
		Main(
			Section(Class("commit"),
				Pre(g.Text(diff.Commit.Message)),
				Div(Class("commit-info"),
					g.Text(diff.Commit.Author.Name+" "),
					A(Href(fmt.Sprintf("mailto:%s", diff.Commit.Author.Email)),
						Class("commit-email"),
						g.Text(diff.Commit.Author.Email)),
					Div(g.Text(diff.Commit.Author.When.Format("Mon, 02 Jan 2006 15:04:05 -0700"))),
				),
				Div(
					Strong(g.Text("commit")),
					P(A(Href(fmt.Sprintf("/%s/commit/%s", data.Name, diff.Commit.This)),
						Class("commit-hash"),
						g.Text(diff.Commit.This))),
				),
				g.If(diff.Commit.Parent != "",
					Div(
						Strong(g.Text("parent")),
						P(A(Href(fmt.Sprintf("/%s/commit/%s", data.Name, diff.Commit.Parent)),
							Class("commit-hash"),
							g.Text(diff.Commit.Parent))),
					),
				),
				Div(Class("diff-stat"),
					Div(g.Textf("%d file%s changed, %d insertion%s(+), %d deletion%s(-)",
						diff.Stat.FilesChanged, pluralise(diff.Stat.FilesChanged),
						diff.Stat.Insertions, pluralise(diff.Stat.Insertions),
						diff.Stat.Deletions, pluralise(diff.Stat.Deletions))),
					Div(
						Br(),
						Strong(g.Text("jump to")),
						Ul(g.Map(diff.Diff, func(d git.Diff) g.Node {
							return Li(A(Href("#"+d.Name.New), g.Text(d.Name.New)))
						})),
					),
				),
			),
			Section(
				g.Map(diff.Diff, func(d git.Diff) g.Node {
					return Div(ID(d.Name.New),
						Div(Class("diff"),
							g.If(d.IsNew,
								Span(Class("diff-type"), g.Text("A")),
								g.If(d.IsDelete,
									Span(Class("diff-type"), g.Text("D")),
									Span(Class("diff-type"), g.Text("M")),
								),
							),
							g.Text(" "),
							g.If(d.Name.Old != "",
								g.Group{
									A(Href(fmt.Sprintf("/%s/blob/%s/%s", data.Name, diff.Commit.Parent, d.Name.Old)),
										g.Text(d.Name.Old)),
									g.If(d.Name.New != "",
										g.Group{
											g.Text(" → "),
											A(
												Href(
													fmt.Sprintf("/%s/blob/%s/%s", data.Name, diff.Commit.This, d.Name.New),
												),
												g.Text(d.Name.New),
											),
										},
									),
								},
								A(Href(fmt.Sprintf("/%s/blob/%s/%s", data.Name, diff.Commit.This, d.Name.New)),
									g.Text(d.Name.New)),
							),
							g.If(d.IsBinary,
								P(g.Text("Not showing binary file.")),
								Pre(
									g.Group(g.Map(d.TextFragments, func(tf git.TextFragment) g.Node {
										return g.Group(
											[]g.Node{
												Span(g.Attr("style", "display: block"), g.Text(tf.Header)),
												g.Map(tf.Lines, func(line gitdiff.Line) g.Node {
													switch line.Op.String() {
													case "+":
														return Span(Class("diff-add"), g.Text(line.String()))
													case "-":
														return Span(Class("diff-del"), g.Text(line.String()))
													default:
														return Span(Class("diff-noop"), g.Text(line.String()))
													}
												}),
											})
									})),
								),
							),
						),
					)
				})...,
			),
		),
	})
}

func pluralise(n int) string {
	if n == 1 {
		return ""
	}
	return "s"
}