This commit is contained in:
Unknwon 2014-12-09 02:18:25 -05:00
parent 6f71632e3e
commit 9a1fe801e5
12 changed files with 84 additions and 48 deletions

View File

@ -3,3 +3,4 @@
Thomas Fanninger <gogs.thomas@fanninger.at> Thomas Fanninger <gogs.thomas@fanninger.at>
Łukasz Jan Niemier <lukasz@niemier.pl> Łukasz Jan Niemier <lukasz@niemier.pl>
Lafriks <lafriks@gmail.com>

View File

@ -34,7 +34,7 @@ account_settings=Konta iestatījumi
settings=Iestatījumi settings=Iestatījumi
news_feed=Jaunumu plūsma news_feed=Jaunumu plūsma
pull_requests=Vilkšanas pieprasījumi pull_requests=Izmaiņu pieprasījumi
issues=Problēmas issues=Problēmas
cancel=Atcelt cancel=Atcelt
@ -51,12 +51,12 @@ db_name=Datu bāzes nosaukums
db_helper=Nepieciešams izmantot MySQL INNODB dzini ar rakstzīmju kopu utf8_general_ci. db_helper=Nepieciešams izmantot MySQL INNODB dzini ar rakstzīmju kopu utf8_general_ci.
ssl_mode=SSL režīms ssl_mode=SSL režīms
path=Ceļš path=Ceļš
sqlite_helper=SQLite 3 datu bāzes faila ceļš. sqlite_helper=SQLite 3 datu bāzes faila atrašanās vieta.
general_title=Gogs vispārīgie iestatījumi general_title=Gogs vispārīgie iestatījumi
repo_path=Repozitorija saknes ceļš repo_path=Repozitoriju glabāšanas vieta
repo_path_helper=Visi Git attālinātie repozitoriji tiks glabāti šajā direktorijā. repo_path_helper=Visi Git attālinātie repozitoriji tiks glabāti šajā direktorijā.
run_user=Izpildes lietotājs run_user=Izpildes lietotājs
run_user_helper=Lietotājam ir jābūt tiesībām rakstīšanas tiesībām repozitorija saknes direktorijai un Gogs jābūt palaistam zem šī lietotāja. run_user_helper=Lietotājam ir jābūt rakstīšanas tiesībām repozitorija saknes direktorijai un Gogs jābūt palaistam zem šī lietotāja.
domain=Domēns domain=Domēns
domain_helper=Tas ietekmē SSH klonēšanas URL. domain_helper=Tas ietekmē SSH klonēšanas URL.
app_url=Lietotnes URL app_url=Lietotnes URL
@ -77,14 +77,14 @@ install_gogs=Instalēt Gogs
test_git_failed=Kļūda pārbaudot 'git' komandu: %v test_git_failed=Kļūda pārbaudot 'git' komandu: %v
sqlite3_not_available=Jūsu versija neatbalsta SQLite3, lūdzu lejupielādējiet oficiālo bināro versiju no %s, NEVIS gobuild versiju. sqlite3_not_available=Jūsu versija neatbalsta SQLite3, lūdzu lejupielādējiet oficiālo bināro versiju no %s, NEVIS gobuild versiju.
invalid_db_setting=Datu bāzes iestatījums nav pareizs: %v invalid_db_setting=Datu bāzes iestatījums nav pareizs: %v
invalid_repo_path=Repozitorija saknes ceļš ir nekorekts: %v invalid_repo_path=Repozitorija atrašanās vieta ir nekorekta: %v
run_user_not_match=Izpildes lietotājs nav pašreizējais lietotājs: %s -> %s run_user_not_match=Izpildes lietotājs nav pašreizējais lietotājs: %s -> %s
save_config_failed=Neizdevās saglanāt konfigurāciju: %v save_config_failed=Neizdevās saglabāt konfigurāciju: %v
invalid_admin_setting=Nekorekts admin konta iestatījums: %v invalid_admin_setting=Nekorekts admin konta iestatījums: %v
install_success=Laipni lūdzam! Mēs priecājamies, ka Jūs izvēlaties Gogs, patīkamu lietošanu! install_success=Laipni lūdzam! Mēs priecājamies, ka Jūs izvēlaties Gogs, patīkamu lietošanu!
[home] [home]
uname_holder=Lietotājvārds vai e-pasta adrese uname_holder=Lietotājvārds vai e-pasts
password_holder=Parole password_holder=Parole
switch_dashboard_context=Mainīt infopaneļa kontekstu switch_dashboard_context=Mainīt infopaneļa kontekstu
my_repos=Mani repozitoriji my_repos=Mani repozitoriji
@ -291,7 +291,7 @@ no_desc=Nav apraksta
quick_guide=Īsa pamācība quick_guide=Īsa pamācība
clone_this_repo=Klonēt šo repozitoriju clone_this_repo=Klonēt šo repozitoriju
create_new_repo_command=Izveidot jaunu repozitoriju komandrindā create_new_repo_command=Izveidot jaunu repozitoriju komandrindā
push_exist_repo=Veikt <code>push</code> darbību eksistējošam repozitorijam no komandrindas push_exist_repo=Nosūtīt izmaiņas no komandrindas eksistējošam repozitorijam
branch=Atzars branch=Atzars
tree=Koks tree=Koks
@ -354,7 +354,7 @@ settings.payload_url=Vērtuma URL
settings.content_type=Satura tips settings.content_type=Satura tips
settings.secret=Noslēpums settings.secret=Noslēpums
settings.event_desc=Kādu notikumu rezultātā tiktu izsaukts tīmekļā āķis? settings.event_desc=Kādu notikumu rezultātā tiktu izsaukts tīmekļā āķis?
settings.event_push_only=Tikai <code>push</code> notikums. settings.event_push_only=Tikai izmaiņu nosūtīšanas notikumiem.
settings.active=Aktīvs settings.active=Aktīvs
settings.active_helper=Tiks nosūtīti notikuma dati, kad nostrādās šis āķis. settings.active_helper=Tiks nosūtīti notikuma dati, kad nostrādās šis āķis.
settings.add_hook_success=Jauns tīmekļa āķis tika veiksmīgi pievienots. settings.add_hook_success=Jauns tīmekļa āķis tika veiksmīgi pievienots.
@ -430,7 +430,7 @@ teams.leave=Atstāt
teams.read_access=Lasīšanas piekļuve teams.read_access=Lasīšanas piekļuve
teams.read_access_helper=Komanda varēs skatīties un klonēt šīs organizācijas repozitorijus. teams.read_access_helper=Komanda varēs skatīties un klonēt šīs organizācijas repozitorijus.
teams.write_access=Rakstīšanas piekļuve teams.write_access=Rakstīšanas piekļuve
teams.write_access_helper=Komanda varēs skatīties un klonēt, kā arī veikt <code>push</code> darbību šīs organizācijas repozitorijiem. teams.write_access_helper=Komanda varēs skatīties un klonēt, kā arī nosūtīt izmaiņas šīs organizācijas repozitorijiem.
teams.admin_access=Administratora piekļuve teams.admin_access=Administratora piekļuve
teams.admin_access_helper=Šī komanda varēs veikt push/pull komandas tās repozitorijiem, kā arī tiem pievienot citus līdzstrādniekus. teams.admin_access_helper=Šī komanda varēs veikt push/pull komandas tās repozitorijiem, kā arī tiem pievienot citus līdzstrādniekus.
teams.no_desc=Komandai nav apraksta teams.no_desc=Komandai nav apraksta
@ -444,7 +444,7 @@ teams.delete_team_title=Komandas dzēšana
teams.delete_team_desc=Komanda tiks dzēsta, vai vēlaties turpināt? Komandas biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem. teams.delete_team_desc=Komanda tiks dzēsta, vai vēlaties turpināt? Komandas biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem.
teams.delete_team_success=Komanda tika veiksmīgi izdzēsta. teams.delete_team_success=Komanda tika veiksmīgi izdzēsta.
teams.read_permission_desc=Šai komandai ir <strong>lasīšanas</strong> tiesības: dalībnieki var skatīties un klonēt komandas repozitorijus. teams.read_permission_desc=Šai komandai ir <strong>lasīšanas</strong> tiesības: dalībnieki var skatīties un klonēt komandas repozitorijus.
teams.write_permission_desc=Šai komandai ir <strong>rakstīšanas</strong> tiesības: dalībnieki var lasīt un veikt <code>push</code> komandas repozitorijiem. teams.write_permission_desc=Šai komandai ir <strong>rakstīšanas</strong> tiesības: dalībnieki var lasīt un nosūtīt izmaiņas repozitorijiem.
teams.admin_permission_desc=Šai komandai ir <strong>administratora</strong> tiesības: dalībnieki var lasīt, rakstīt un pievienot citus dalībniekus komandas repozitorijiem. teams.admin_permission_desc=Šai komandai ir <strong>administratora</strong> tiesības: dalībnieki var lasīt, rakstīt un pievienot citus dalībniekus komandas repozitorijiem.
teams.repositories=Komandas repozitoriji teams.repositories=Komandas repozitoriji
teams.add_team_repository=Pievienot komandas repozitoriju teams.add_team_repository=Pievienot komandas repozitoriju
@ -529,12 +529,12 @@ users.delete_account=Dzēst šo kontu
users.still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku. users.still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku.
users.still_has_org=Šis konts ir vismaz vienas organizācijas biedrs, sākumā nepieciešams pamest vai izdzēst šo organizāciju. users.still_has_org=Šis konts ir vismaz vienas organizācijas biedrs, sākumā nepieciešams pamest vai izdzēst šo organizāciju.
orgs.org_manage_panel=Organizācijas pārvaldīšanas panelis orgs.org_manage_panel=Organizāciju pārvaldības panelis
orgs.name=Nosaukums orgs.name=Nosaukums
orgs.teams=Komandas orgs.teams=Komandas
orgs.members=Dalībnieki orgs.members=Dalībnieki
repos.repo_manage_panel=Repozitorija pārvaldes panelis repos.repo_manage_panel=Repozitoriju pārvaldības panelis
repos.owner=Īpašnieks repos.owner=Īpašnieks
repos.name=Vārds repos.name=Vārds
repos.private=Privāts repos.private=Privāts
@ -542,7 +542,7 @@ repos.watches=Vērošana
repos.stars=Atzīmētās zvaigznītes repos.stars=Atzīmētās zvaigznītes
repos.issues=Problēmas repos.issues=Problēmas
auths.auth_manage_panel=Autorizācijas pārvaldīšanas panelis auths.auth_manage_panel=Autorizāciju pārvaldības panelis
auths.new=Pievienot jaunu autorizācijas veidu auths.new=Pievienot jaunu autorizācijas veidu
auths.name=Nosaukums auths.name=Nosaukums
auths.type=Veids auths.type=Veids
@ -580,9 +580,9 @@ config.offline_mode=Bezsaistes režīms
config.disable_router_log=Atspējot maršrutētāja žurnalizēšanu config.disable_router_log=Atspējot maršrutētāja žurnalizēšanu
config.run_user=Izpildes lietotājs config.run_user=Izpildes lietotājs
config.run_mode=Izpildes režīms config.run_mode=Izpildes režīms
config.repo_root_path=Repozitorija saknes ceļš config.repo_root_path=Repozitoriju glabāšanas vieta
config.static_file_root_path=Statisko failu direktorija config.static_file_root_path=Statisko failu atrašanās vieta
config.log_file_root_path=Žurnalizēšānas failu direktorija config.log_file_root_path=Žurnalizēšanas failu glabāšanas vieta
config.script_type=Skripta veids config.script_type=Skripta veids
config.reverse_auth_user=Reversā lietotāja autentifikācija config.reverse_auth_user=Reversā lietotāja autentifikācija
config.db_config=Datu bāzes konfigurācija config.db_config=Datu bāzes konfigurācija
@ -650,12 +650,12 @@ notices.op=Op.
notices.delete_success=Sistēmas paziņojums tika veiksmīgi izdzēsts. notices.delete_success=Sistēmas paziņojums tika veiksmīgi izdzēsts.
[action] [action]
create_repo=izveidots repozitorijs <a href="%s/%s">%s</a> create_repo=izveidoja repozitoriju <a href="%s/%s">%s</a>
commit_repo=veica <code>push</code> atzaram <a href="%s/%s/src/%s">%s</a> repozitorijam <a href="%s/%s">%s</a> commit_repo=veica izmaiņu nosūtīšanu atzaram <a href="%s/%s/src/%s">%s</a> repozitorijā <a href="%s/%s">%s</a>
create_issue=reģistrēta problēma <a href="%s/%s/issues/%s">%s#%s</a> create_issue=reģistrēja problēmu <a href="%s/%s/issues/%s">%s#%s</a>
comment_issue=pievienots komentārs problēmai <a href="%s/%s/issues/%s">%s#%s</a> comment_issue=pievienoja komentāru problēmai <a href="%s/%s/issues/%s">%s#%s</a>
transfer_repo=Mainīja repozitorija īpašnieku <code>%s</code> uz <a href="/%s%s">%s</a> transfer_repo=mainīja repozitorija <code>%s</code> īpašnieku uz <a href="/%s%s">%s</a>
push_tag=veica <code>push</code> birkai <a href="%s/%s/src/%s">%s</a> uz <a href="%s/%s">%s</a> push_tag=pievienoja birku <a href="%s/%s/src/%s">%s</a> repozitorijam <a href="%s/%s">%s</a>
compare_2_commits=Veikt salīdzināšanu starp šīm 2 revīzijām compare_2_commits=Veikt salīdzināšanu starp šīm 2 revīzijām
[tool] [tool]
@ -665,7 +665,7 @@ now=tagad
1s=1 sekundi %s 1s=1 sekundi %s
1m=1 minūti %s 1m=1 minūti %s
1h=1 stundu %s 1h=1 stundu %s
1d=1 diena %s 1d=1 dienu %s
1w=1 nedēļu %s 1w=1 nedēļu %s
1mon=1 mēnesi %s 1mon=1 mēnesi %s
1y=1 gadu %s 1y=1 gadu %s

View File

@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
const APP_VER = "0.5.8.1205 Beta" const APP_VER = "0.5.8.1209 Beta"
func init() { func init() {
runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(runtime.NumCPU())

View File

@ -6,6 +6,7 @@ package models
import ( import (
"bufio" "bufio"
"bytes"
"fmt" "fmt"
"io" "io"
"os" "os"
@ -15,8 +16,10 @@ import (
"github.com/Unknwon/com" "github.com/Unknwon/com"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/git" "github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/mahonia"
"github.com/gogits/gogs/modules/process" "github.com/gogits/gogs/modules/process"
) )
@ -80,6 +83,8 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
leftLine, rightLine int leftLine, rightLine int
isTooLong bool isTooLong bool
// FIXME: use first 30 lines to detect file encoding. Should use cache in the future.
buf bytes.Buffer
) )
diff := &Diff{Files: make([]*DiffFile, 0)} diff := &Diff{Files: make([]*DiffFile, 0)}
@ -97,6 +102,11 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
i = i + 1 i = i + 1
// FIXME: use first 30 lines to detect file encoding.
if i <= 30 {
buf.WriteString(line)
}
// Diff data too large, we only show the first about maxlines lines // Diff data too large, we only show the first about maxlines lines
if i == maxlines { if i == maxlines {
isTooLong = true isTooLong = true
@ -181,6 +191,21 @@ func ParsePatch(pid int64, maxlines int, cmd *exec.Cmd, reader io.Reader) (*Diff
} }
} }
// FIXME: use first 30 lines to detect file encoding.
charset, err := base.DetectEncoding(buf.Bytes())
if charset != "utf8" && err == nil {
decoder := mahonia.NewDecoder(charset)
if decoder != nil {
for _, f := range diff.Files {
for _, sec := range f.Sections {
for _, l := range sec.Lines {
l.Content = decoder.ConvertString(l.Content)
}
}
}
}
}
return diff, nil return diff, nil
} }

View File

@ -154,7 +154,7 @@ func RenderSpecialLink(rawBytes []byte, urlPrefix string) []byte {
rawBytes = bytes.Replace(rawBytes, m, []byte(fmt.Sprintf( rawBytes = bytes.Replace(rawBytes, m, []byte(fmt.Sprintf(
` <a href="%s">#%s</a>`, m, ShortSha(string(m[i+7:j])))), -1) ` <a href="%s">#%s</a>`, m, ShortSha(string(m[i+7:j])))), -1)
} }
rawBytes = RenderissueIndexPattern(rawBytes, urlPrefix) rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix)
rawBytes = RenderSha1CurrentPattern(rawBytes, urlPrefix) rawBytes = RenderSha1CurrentPattern(rawBytes, urlPrefix)
return rawBytes return rawBytes
} }
@ -168,7 +168,7 @@ func RenderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte {
return rawBytes return rawBytes
} }
func RenderissueIndexPattern(rawBytes []byte, urlPrefix string) []byte { func RenderIssueIndexPattern(rawBytes []byte, urlPrefix string) []byte {
ms := issueIndexPattern.FindAll(rawBytes, -1) ms := issueIndexPattern.FindAll(rawBytes, -1)
for _, m := range ms { for _, m := range ms {
rawBytes = bytes.Replace(rawBytes, m, []byte(fmt.Sprintf( rawBytes = bytes.Replace(rawBytes, m, []byte(fmt.Sprintf(

View File

@ -47,18 +47,23 @@ func ShortSha(sha1 string) string {
return sha1 return sha1
} }
func ToUtf8WithErr(content []byte) (error, string) { func DetectEncoding(content []byte) (string, error) {
detector := chardet.NewTextDetector() detector := chardet.NewTextDetector()
result, err := detector.DetectBest(content) result, err := detector.DetectBest(content)
return result.Charset, err
}
func ToUtf8WithErr(content []byte) (error, string) {
charset, err := DetectEncoding(content)
if err != nil { if err != nil {
return err, "" return err, ""
} }
if result.Charset == "utf8" { if charset == "utf8" {
return nil, string(content) return nil, string(content)
} }
decoder := mahonia.NewDecoder(result.Charset) decoder := mahonia.NewDecoder(charset)
if decoder != nil { if decoder != nil {
return nil, decoder.ConvertString(string(content)) return nil, decoder.ConvertString(string(content))
} }

View File

@ -33,6 +33,16 @@ func RefCommits(ctx *middleware.Context) {
} }
} }
func RenderIssueLinks(oldCommits *list.List, repoLink string) *list.List {
newCommits := list.New()
for e := oldCommits.Front(); e != nil; e = e.Next() {
c := e.Value.(*git.Commit)
c.CommitMessage = string(base.RenderIssueIndexPattern([]byte(c.CommitMessage), repoLink))
newCommits.PushBack(c)
}
return newCommits
}
func Commits(ctx *middleware.Context) { func Commits(ctx *middleware.Context) {
ctx.Data["IsRepoToolbarCommits"] = true ctx.Data["IsRepoToolbarCommits"] = true
@ -86,16 +96,6 @@ func Commits(ctx *middleware.Context) {
ctx.HTML(200, COMMITS) ctx.HTML(200, COMMITS)
} }
func RenderIssueLinks(oldCommits *list.List, repoLink string) *list.List {
newCommits := list.New()
for e := oldCommits.Front(); e != nil; e = e.Next() {
c := e.Value.(*git.Commit)
c.CommitMessage = string(base.RenderissueIndexPattern([]byte(c.CommitMessage), repoLink))
newCommits.PushBack(c)
}
return newCommits
}
func SearchCommits(ctx *middleware.Context) { func SearchCommits(ctx *middleware.Context) {
ctx.Data["IsSearchPage"] = true ctx.Data["IsSearchPage"] = true
ctx.Data["IsRepoToolbarCommits"] = true ctx.Data["IsRepoToolbarCommits"] = true
@ -206,7 +206,7 @@ func Diff(ctx *middleware.Context) {
commitId := ctx.Repo.CommitId commitId := ctx.Repo.CommitId
commit := ctx.Repo.Commit commit := ctx.Repo.Commit
commit.CommitMessage = string(base.RenderissueIndexPattern([]byte(commit.CommitMessage), ctx.Repo.RepoLink)) commit.CommitMessage = string(base.RenderIssueIndexPattern([]byte(commit.CommitMessage), ctx.Repo.RepoLink))
diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName), diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName),
commitId, setting.MaxGitDiffLines) commitId, setting.MaxGitDiffLines)
if err != nil { if err != nil {

View File

@ -152,6 +152,11 @@ func Home(ctx *middleware.Context) {
} }
} }
// Render issue index links.
for _, f := range files {
c := f[1].(*git.Commit)
c.CommitMessage = string(base.RenderIssueIndexPattern([]byte(c.CommitMessage), ctx.Repo.RepoLink))
}
ctx.Data["Files"] = files ctx.Data["Files"] = files
var readmeFile *git.Blob var readmeFile *git.Blob
@ -199,7 +204,7 @@ func Home(ctx *middleware.Context) {
} }
lastCommit := ctx.Repo.Commit lastCommit := ctx.Repo.Commit
lastCommit.CommitMessage = string(base.RenderissueIndexPattern([]byte(lastCommit.CommitMessage), ctx.Repo.RepoLink)) lastCommit.CommitMessage = string(base.RenderIssueIndexPattern([]byte(lastCommit.CommitMessage), ctx.Repo.RepoLink))
if len(treePath) > 0 { if len(treePath) > 0 {
c, err := ctx.Repo.Commit.GetCommitOfRelPath(treePath) c, err := ctx.Repo.Commit.GetCommitOfRelPath(treePath)
if err != nil { if err != nil {

View File

@ -1 +1 @@
0.5.8.1205 Beta 0.5.8.1209 Beta

View File

@ -38,8 +38,8 @@
</table> </table>
{{if or .LastPageNum .NextPageNum}} {{if or .LastPageNum .NextPageNum}}
<ul class="pagination"> <ul class="pagination">
{{if .LastPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="{{AppSubUrl}}/admin/users?p={{.LastPageNum}}">&laquo; {{.i18n.Tr "admin.prev"}}</a></li>{{end}} {{if .LastPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="{{AppSubUrl}}/admin/notices?p={{.LastPageNum}}">&laquo; {{.i18n.Tr "admin.prev"}}</a></li>{{end}}
{{if .NextPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="{{AppSubUrl}}/admin/users?p={{.NextPageNum}}">&raquo; {{.i18n.Tr "admin.next"}}</a></li>{{end}} {{if .NextPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="{{AppSubUrl}}/admin/notices?p={{.NextPageNum}}">&raquo; {{.i18n.Tr "admin.next"}}</a></li>{{end}}
</ul> </ul>
{{end}} {{end}}
</div> </div>

View File

@ -112,7 +112,7 @@
</td> </td>
<td class="lines-code"> <td class="lines-code">
<pre>{{ToUtf8 .Content}}</pre> <pre>{{.Content}}</pre>
</td> </td>
</tr> </tr>
{{end}} {{end}}

View File

@ -1,7 +1,7 @@
<table id="repo-files-table" class="table-border table-block table-radius"> <table id="repo-files-table" class="table-border table-block table-radius">
<thead> <thead>
<tr> <tr>
<th colspan="4" class="clear"> <th colspan="5" class="clear">
<span class="author left"> <span class="author left">
{{if .LastCommitUser}} {{if .LastCommitUser}}
<img class="avatar-24 radius" src="{{.LastCommitUser.AvatarLink}}" /> <img class="avatar-24 radius" src="{{.LastCommitUser.AvatarLink}}" />