forked from NYANDEV/forgejo
Render commit msg as header + verbatim description
Most commit in Git are expected to follow standard of single header line, followed by description paragraphs, separated by empty line from previous block. Previously Gogs were treating everything as single header. Now we are trying to render only first line as header, but following lines (description chunks) as a verbatim.
This commit is contained in:
parent
b5f6206a65
commit
e2ca53029e
6 changed files with 52 additions and 25 deletions
|
@ -183,15 +183,27 @@ func ReplaceLeft(s, old, new string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// RenderCommitMessage renders commit message with XSS-safe and special links.
|
// RenderCommitMessage renders commit message with XSS-safe and special links.
|
||||||
func RenderCommitMessage(msg, urlPrefix string, metas map[string]string) template.HTML {
|
func RenderCommitMessage(full bool, msg, urlPrefix string, metas map[string]string) template.HTML {
|
||||||
cleanMsg := template.HTMLEscapeString(msg)
|
cleanMsg := template.HTMLEscapeString(msg)
|
||||||
fullMessage := string(base.RenderIssueIndexPattern([]byte(cleanMsg), urlPrefix, metas))
|
fullMessage := string(base.RenderIssueIndexPattern([]byte(cleanMsg), urlPrefix, metas))
|
||||||
msgLines := strings.Split(strings.TrimSpace(fullMessage), "\n")
|
msgLines := strings.Split(strings.TrimSpace(fullMessage), "\n")
|
||||||
for i := range msgLines {
|
numLines := len(msgLines)
|
||||||
msgLines[i] = ReplaceLeft(msgLines[i], " ", " ")
|
if numLines == 0 {
|
||||||
|
return template.HTML("")
|
||||||
|
} else if !full {
|
||||||
|
return template.HTML(msgLines[0])
|
||||||
|
} else if numLines == 1 || (numLines >= 2 && len(msgLines[1]) == 0) {
|
||||||
|
// First line is a header, standalone or followed by empty line
|
||||||
|
header := fmt.Sprintf("<h3>%s</h3>", msgLines[0])
|
||||||
|
if numLines >= 2 {
|
||||||
|
fullMessage = header + fmt.Sprintf("\n<pre>%s</pre>", strings.Join(msgLines[2:], "\n"))
|
||||||
|
} else {
|
||||||
|
fullMessage = header
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Non-standard git message, there is no header line
|
||||||
|
fullMessage = fmt.Sprintf("<h4>%s</h4>", strings.Join(msgLines, "<br>"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fullMessage = strings.Join(msgLines, "<br>")
|
|
||||||
return template.HTML(fullMessage)
|
return template.HTML(fullMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -895,13 +895,22 @@ pre.raw {
|
||||||
.ui .warning.segment {
|
.ui .warning.segment {
|
||||||
border-color: #F0C36D;
|
border-color: #F0C36D;
|
||||||
}
|
}
|
||||||
.ui .info.header {
|
|
||||||
background-color: #d9edf7 !important;
|
|
||||||
border-color: #85c5e5;
|
|
||||||
}
|
|
||||||
.ui .info.segment {
|
.ui .info.segment {
|
||||||
border-color: #85c5e5;
|
border-color: #85c5e5;
|
||||||
}
|
}
|
||||||
|
.ui .info.segment.top {
|
||||||
|
background-color: #d9edf7 !important;
|
||||||
|
}
|
||||||
|
.ui .info.segment.top h3,
|
||||||
|
.ui .info.segment.top h4 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.ui .info.segment.top h3:last-child {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
.ui .info.segment.top > :last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
.ui .normal.header {
|
.ui .normal.header {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,12 +196,20 @@ pre {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.info {
|
.info {
|
||||||
&.header {
|
|
||||||
background-color: #d9edf7 !important;
|
|
||||||
border-color: #85c5e5;
|
|
||||||
}
|
|
||||||
&.segment {
|
&.segment {
|
||||||
border-color: #85c5e5;
|
border-color: #85c5e5;
|
||||||
|
&.top {
|
||||||
|
background-color: #d9edf7 !important;
|
||||||
|
h3, h4 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
h3:last-child {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
> :last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td class="message collapsing">
|
<td class="message collapsing">
|
||||||
<a rel="nofollow" class="ui sha label" href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{.ID}}">{{ShortSha .ID.String}}</a>
|
<a rel="nofollow" class="ui sha label" href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{.ID}}">{{ShortSha .ID.String}}</a>
|
||||||
{{RenderCommitMessage .Summary $.RepoLink $.Repository.ComposeMetas}}
|
{{RenderCommitMessage false .Summary $.RepoLink $.Repository.ComposeMetas}}
|
||||||
</td>
|
</td>
|
||||||
<td class="grey text right aligned">{{TimeSince .Author.When $.Lang}}</td>
|
<td class="grey text right aligned">{{TimeSince .Author.When $.Lang}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -5,14 +5,12 @@
|
||||||
{{if .IsDiffCompare }}
|
{{if .IsDiffCompare }}
|
||||||
{{template "repo/commits_table" .}}
|
{{template "repo/commits_table" .}}
|
||||||
{{else}}
|
{{else}}
|
||||||
<h4 class="ui top attached info header">
|
<div class="ui top attached info clearing segment">
|
||||||
<div class="ui right">
|
<a class="ui floated right blue tiny button" href="{{EscapePound .SourcePath}}">
|
||||||
<a class="ui blue tiny button" href="{{EscapePound .SourcePath}}">
|
{{.i18n.Tr "repo.diff.browse_source"}}
|
||||||
{{.i18n.Tr "repo.diff.browse_source"}}
|
</a>
|
||||||
</a>
|
{{RenderCommitMessage true .Commit.Message $.RepoLink $.Repository.ComposeMetas}}
|
||||||
</div>
|
</div>
|
||||||
{{RenderCommitMessage .Commit.Message $.RepoLink $.Repository.ComposeMetas}}
|
|
||||||
</h4>
|
|
||||||
<div class="ui attached info segment">
|
<div class="ui attached info segment">
|
||||||
{{if .Author}}
|
{{if .Author}}
|
||||||
<img class="ui avatar image" src="{{.Author.AvatarLink}}" />
|
<img class="ui avatar image" src="{{.Author.AvatarLink}}" />
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<strong>{{.LastCommit.Author.Name}}</strong>
|
<strong>{{.LastCommit.Author.Name}}</strong>
|
||||||
{{end}}
|
{{end}}
|
||||||
<a rel="nofollow" class="ui sha label" href="{{.RepoLink}}/commit/{{.LastCommit.ID}}" rel="nofollow">{{ShortSha .LastCommit.ID.String}}</a>
|
<a rel="nofollow" class="ui sha label" href="{{.RepoLink}}/commit/{{.LastCommit.ID}}" rel="nofollow">{{ShortSha .LastCommit.ID.String}}</a>
|
||||||
<span class="grey">{{RenderCommitMessage .LastCommit.Summary .RepoLink $.Repository.ComposeMetas}}</span>
|
<span class="grey">{{RenderCommitMessage false .LastCommit.Summary .RepoLink $.Repository.ComposeMetas}}</span>
|
||||||
</th>
|
</th>
|
||||||
<th class="nine wide">
|
<th class="nine wide">
|
||||||
</th>
|
</th>
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
{{end}}
|
{{end}}
|
||||||
<td class="message collapsing">
|
<td class="message collapsing">
|
||||||
<a rel="nofollow" class="ui sha label" href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{$commit.ID}}">{{ShortSha $commit.ID.String}}</a>
|
<a rel="nofollow" class="ui sha label" href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{$commit.ID}}">{{ShortSha $commit.ID.String}}</a>
|
||||||
{{RenderCommitMessage $commit.Summary $.RepoLink $.Repository.ComposeMetas}}
|
{{RenderCommitMessage false $commit.Summary $.RepoLink $.Repository.ComposeMetas}}
|
||||||
</td>
|
</td>
|
||||||
<td class="text grey right age">{{TimeSince $commit.Committer.When $.Lang}}</td>
|
<td class="text grey right age">{{TimeSince $commit.Committer.When $.Lang}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
Loading…
Reference in a new issue