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 121 122 123 124 125 126 127 | package templates import ( "fmt" "github.com/bluekeyes/go-gitdiff/gitdiff" "github.com/go-git/go-git/v5/plumbing/object" "go.alanpearce.eu/elgit/git" g "go.alanpearce.eu/gomponents" . "go.alanpearce.eu/gomponents/html" ) // CommitPage renders a commit diff page func CommitPage(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)), CommitInfo(diff.Commit.Author), 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{ Header(Class("diff-hunk-header"), 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 CommitInfo(author object.Signature) g.Node { return Div(Class("commit-info"), g.Text(author.Name+" "), A( Href(fmt.Sprintf("mailto:%s", author.Email)), Class("commit-email"), g.Text(author.Email), ), Div(g.Text(author.When.Format("Mon, 02 Jan 2006 15:04:05 -0700"))), ) } func pluralise(n int) string { if n == 1 { return "" } return "s" } |