diff --git a/README.md b/README.md
index df8fa6119..a01b83cc3 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?bra
![](public/img/gogs-large-resize.png)
-##### Current version: 0.7.7 Beta
+##### Current version: 0.7.8 Beta
diff --git a/cmd/web.go b/cmd/web.go
index 9ed9d5678..e51b1bb97 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -7,7 +7,7 @@ package cmd
import (
"crypto/tls"
"fmt"
- "html/template"
+ gotmpl "html/template"
"io/ioutil"
"net/http"
"net/http/fcgi"
@@ -35,11 +35,11 @@ import (
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/auth/apiv1"
"github.com/gogits/gogs/modules/avatar"
- "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/bindata"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
+ "github.com/gogits/gogs/modules/template"
"github.com/gogits/gogs/routers"
"github.com/gogits/gogs/routers/admin"
"github.com/gogits/gogs/routers/api/v1"
@@ -124,7 +124,7 @@ func newMacaron() *macaron.Macaron {
))
m.Use(macaron.Renderer(macaron.RenderOptions{
Directory: path.Join(setting.StaticRootPath, "templates"),
- Funcs: []template.FuncMap{base.TemplateFuncs},
+ Funcs: []gotmpl.FuncMap{template.Funcs},
IndentJSON: macaron.Env != macaron.PROD,
}))
diff --git a/gogs.go b/gogs.go
index 67b1cc089..65571c063 100644
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting"
)
-const APP_VER = "0.7.7.1113 Beta"
+const APP_VER = "0.7.8.1113 Beta"
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
diff --git a/models/action.go b/models/action.go
index 536476d7e..bb15d4a3d 100644
--- a/models/action.go
+++ b/models/action.go
@@ -208,8 +208,48 @@ func issueIndexTrimRight(c rune) bool {
return !unicode.IsDigit(c)
}
+type PushCommit struct {
+ Sha1 string
+ Message string
+ AuthorEmail string
+ AuthorName string
+}
+
+type PushCommits struct {
+ Len int
+ Commits []*PushCommit
+ CompareUrl string
+
+ avatars map[string]string
+}
+
+func NewPushCommits() *PushCommits {
+ return &PushCommits{
+ avatars: make(map[string]string),
+ }
+}
+
+// AvatarLink tries to match user in database with e-mail
+// in order to show custom avatar, and falls back to general avatar link.
+func (push *PushCommits) AvatarLink(email string) string {
+ _, ok := push.avatars[email]
+ if !ok {
+ u, err := GetUserByEmail(email)
+ if err != nil {
+ push.avatars[email] = base.AvatarLink(email)
+ if !IsErrUserNotExist(err) {
+ log.Error(4, "GetUserByEmail: %v", err)
+ }
+ } else {
+ push.avatars[email] = u.AvatarLink()
+ }
+ }
+
+ return push.avatars[email]
+}
+
// updateIssuesCommit checks if issues are manipulated by commit message.
-func updateIssuesCommit(u *User, repo *Repository, repoUserName, repoName string, commits []*base.PushCommit) error {
+func updateIssuesCommit(u *User, repo *Repository, repoUserName, repoName string, commits []*PushCommit) error {
// Commits are appended in the reverse order.
for i := len(commits) - 1; i >= 0; i-- {
c := commits[i]
@@ -343,7 +383,7 @@ func CommitRepoAction(
repoID int64,
repoUserName, repoName string,
refFullName string,
- commit *base.PushCommits,
+ commit *PushCommits,
oldCommitID string, newCommitID string) error {
u, err := GetUserByID(userID)
@@ -369,7 +409,7 @@ func CommitRepoAction(
// Check it's tag push or branch.
if strings.HasPrefix(refFullName, "refs/tags/") {
opType = PUSH_TAG
- commit = &base.PushCommits{}
+ commit = &PushCommits{}
} else {
// if not the first commit, set the compareUrl
if !strings.HasPrefix(oldCommitID, "0000000") {
diff --git a/models/update.go b/models/update.go
index 7992313a8..14e56ce81 100644
--- a/models/update.go
+++ b/models/update.go
@@ -10,7 +10,6 @@ import (
"os/exec"
"strings"
- "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log"
)
@@ -100,7 +99,7 @@ func Update(refName, oldCommitID, newCommitID, userName, repoUserName, repoName
actEmail = cmt.Committer.Email
}
- commit := &base.PushCommits{}
+ commit := &PushCommits{}
if err = CommitRepoAction(userID, user.Id, userName, actEmail,
repo.ID, repoUserName, repoName, refName, commit, oldCommitID, newCommitID); err != nil {
@@ -133,7 +132,7 @@ func Update(refName, oldCommitID, newCommitID, userName, repoUserName, repoName
}
// Push commits.
- commits := make([]*base.PushCommit, 0)
+ commits := make([]*PushCommit, 0)
var actEmail string
for e := l.Front(); e != nil; e = e.Next() {
commit := e.Value.(*git.Commit)
@@ -141,7 +140,7 @@ func Update(refName, oldCommitID, newCommitID, userName, repoUserName, repoName
actEmail = commit.Committer.Email
}
commits = append(commits,
- &base.PushCommit{commit.ID.String(),
+ &PushCommit{commit.ID.String(),
commit.Message(),
commit.Author.Email,
commit.Author.Name,
@@ -149,7 +148,7 @@ func Update(refName, oldCommitID, newCommitID, userName, repoUserName, repoName
}
if err = CommitRepoAction(userID, user.Id, userName, actEmail,
- repo.ID, repoUserName, repoName, refName, &base.PushCommits{l.Len(), commits, ""}, oldCommitID, newCommitID); err != nil {
+ repo.ID, repoUserName, repoName, refName, &PushCommits{l.Len(), commits, "", nil}, oldCommitID, newCommitID); err != nil {
return fmt.Errorf("runUpdate.models.CommitRepoAction: %s/%s:%v", repoUserName, repoName, err)
}
return nil
diff --git a/models/user.go b/models/user.go
index 628a50f72..5aaf630f4 100644
--- a/models/user.go
+++ b/models/user.go
@@ -991,7 +991,7 @@ func GetUserByEmail(email string) (*User, error) {
return GetUserByID(emailAddress.UID)
}
- return nil, ErrUserNotExist{0, "email"}
+ return nil, ErrUserNotExist{0, email}
}
// SearchUserByName returns given number of users whose name contains keyword.
diff --git a/modules/base/tool.go b/modules/base/tool.go
index b9a97c9c3..78983b361 100644
--- a/modules/base/tool.go
+++ b/modules/base/tool.go
@@ -23,6 +23,8 @@ import (
"github.com/Unknwon/i18n"
"github.com/microcosm-cc/bluemonday"
+ "github.com/gogits/chardet"
+
"github.com/gogits/gogs/modules/avatar"
"github.com/gogits/gogs/modules/setting"
)
@@ -43,6 +45,22 @@ func EncodeSha1(str string) string {
return hex.EncodeToString(h.Sum(nil))
}
+func ShortSha(sha1 string) string {
+ if len(sha1) == 40 {
+ return sha1[:10]
+ }
+ return sha1
+}
+
+func DetectEncoding(content []byte) (string, error) {
+ detector := chardet.NewTextDetector()
+ result, err := detector.DetectBest(content)
+ if result.Charset != "UTF-8" && len(setting.Repository.AnsiCharset) > 0 {
+ return setting.Repository.AnsiCharset, err
+ }
+ return result.Charset, err
+}
+
func BasicAuthDecode(encoded string) (string, string, error) {
s, err := base64.StdEncoding.DecodeString(encoded)
if err != nil {
diff --git a/modules/base/template.go b/modules/template/template.go
similarity index 81%
rename from modules/base/template.go
rename to modules/template/template.go
index ff743e957..d56b10d71 100644
--- a/modules/base/template.go
+++ b/modules/template/template.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
-package base
+package template
import (
"container/list"
@@ -16,7 +16,8 @@ import (
"golang.org/x/net/html/charset"
"golang.org/x/text/transform"
- "github.com/gogits/chardet"
+ "github.com/gogits/gogs/models"
+ "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/setting"
)
@@ -25,7 +26,7 @@ func Safe(raw string) template.HTML {
}
func Str2html(raw string) template.HTML {
- return template.HTML(Sanitizer.Sanitize(raw))
+ return template.HTML(base.Sanitizer.Sanitize(raw))
}
func Range(l int) []int {
@@ -46,27 +47,11 @@ func List(l *list.List) chan interface{} {
}
func Sha1(str string) string {
- return EncodeSha1(str)
-}
-
-func ShortSha(sha1 string) string {
- if len(sha1) == 40 {
- return sha1[:10]
- }
- return sha1
-}
-
-func DetectEncoding(content []byte) (string, error) {
- detector := chardet.NewTextDetector()
- result, err := detector.DetectBest(content)
- if result.Charset != "UTF-8" && len(setting.Repository.AnsiCharset) > 0 {
- return setting.Repository.AnsiCharset, err
- }
- return result.Charset, err
+ return base.EncodeSha1(str)
}
func ToUtf8WithErr(content []byte) (error, string) {
- charsetLabel, err := DetectEncoding(content)
+ charsetLabel, err := base.DetectEncoding(content)
if err != nil {
return err, ""
}
@@ -124,7 +109,7 @@ func ReplaceLeft(s, old, new string) string {
// RenderCommitMessage renders commit message with XSS-safe and special links.
func RenderCommitMessage(msg, urlPrefix string) template.HTML {
cleanMsg := template.HTMLEscapeString(msg)
- fullMessage := string(RenderIssueIndexPattern([]byte(cleanMsg), urlPrefix))
+ fullMessage := string(base.RenderIssueIndexPattern([]byte(cleanMsg), urlPrefix))
msgLines := strings.Split(strings.TrimSpace(fullMessage), "\n")
for i := range msgLines {
msgLines[i] = ReplaceLeft(msgLines[i], " ", " ")
@@ -134,7 +119,7 @@ func RenderCommitMessage(msg, urlPrefix string) template.HTML {
return template.HTML(fullMessage)
}
-var TemplateFuncs template.FuncMap = map[string]interface{}{
+var Funcs template.FuncMap = map[string]interface{}{
"GoVer": func() string {
return strings.Title(runtime.Version())
},
@@ -156,13 +141,13 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
"LoadTimes": func(startTime time.Time) string {
return fmt.Sprint(time.Since(startTime).Nanoseconds()/1e6) + "ms"
},
- "AvatarLink": AvatarLink,
+ "AvatarLink": base.AvatarLink,
"Safe": Safe,
"Str2html": Str2html,
- "TimeSince": TimeSince,
- "RawTimeSince": RawTimeSince,
- "FileSize": FileSize,
- "Subtract": Subtract,
+ "TimeSince": base.TimeSince,
+ "RawTimeSince": base.RawTimeSince,
+ "FileSize": base.FileSize,
+ "Subtract": base.Subtract,
"Add": func(a, b int) int {
return a + b
},
@@ -197,8 +182,8 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
"DiffTypeToStr": DiffTypeToStr,
"DiffLineTypeToStr": DiffLineTypeToStr,
"Sha1": Sha1,
- "ShortSha": ShortSha,
- "Md5": EncodeMd5,
+ "ShortSha": base.ShortSha,
+ "Md5": base.EncodeMd5,
"ActionContent2Commits": ActionContent2Commits,
"Oauth2Icon": Oauth2Icon,
"Oauth2Name": Oauth2Name,
@@ -240,22 +225,9 @@ func ActionIcon(opType int) string {
}
}
-type PushCommit struct {
- Sha1 string
- Message string
- AuthorEmail string
- AuthorName string
-}
-
-type PushCommits struct {
- Len int
- Commits []*PushCommit
- CompareUrl string
-}
-
-func ActionContent2Commits(act Actioner) *PushCommits {
- var push *PushCommits
- if err := json.Unmarshal([]byte(act.GetContent()), &push); err != nil {
+func ActionContent2Commits(act Actioner) *models.PushCommits {
+ push := models.NewPushCommits()
+ if err := json.Unmarshal([]byte(act.GetContent()), push); err != nil {
return nil
}
return push
diff --git a/routers/repo/view.go b/routers/repo/view.go
index 6a3e0cb3b..1d9f1f3d8 100644
--- a/routers/repo/view.go
+++ b/routers/repo/view.go
@@ -16,6 +16,7 @@ import (
"github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/template"
)
const (
@@ -105,7 +106,7 @@ func Home(ctx *middleware.Context) {
if readmeExist {
ctx.Data["FileContent"] = string(base.RenderMarkdown(buf, path.Dir(treeLink)))
} else {
- if err, content := base.ToUtf8WithErr(buf); err != nil {
+ if err, content := template.ToUtf8WithErr(buf); err != nil {
if err != nil {
log.Error(4, "Convert content encoding: %s", err)
}
diff --git a/templates/.VERSION b/templates/.VERSION
index e6ef91678..0c08e60d7 100644
--- a/templates/.VERSION
+++ b/templates/.VERSION
@@ -1 +1 @@
-0.7.7.1113 Beta
\ No newline at end of file
+0.7.8.1113 Beta
\ No newline at end of file
diff --git a/templates/user/dashboard/dashboard.tmpl b/templates/user/dashboard/dashboard.tmpl
index d8791241e..eed5b4073 100644
--- a/templates/user/dashboard/dashboard.tmpl
+++ b/templates/user/dashboard/dashboard.tmpl
@@ -26,7 +26,7 @@
{{range .Repos}}
-
+
{{.Name}}
{{.NumStars}}
@@ -46,7 +46,7 @@
{{range .CollaborativeRepos}}
-
+
{{.Owner.Name}} / {{.Name}}
{{.NumStars}}
@@ -72,7 +72,7 @@
{{range .ContextUser.Orgs}}
-
+
{{.Name}}
{{.NumRepos}}
@@ -94,7 +94,7 @@
{{range .Mirrors}}
-
+
{{.Name}}
{{.Interval}}H
diff --git a/templates/user/dashboard/feeds.tmpl b/templates/user/dashboard/feeds.tmpl
index c814a283c..70142f9a5 100644
--- a/templates/user/dashboard/feeds.tmpl
+++ b/templates/user/dashboard/feeds.tmpl
@@ -39,7 +39,7 @@
{{ $repoLink := .GetRepoLink}}
{{if $push.Commits}}
{{range $push.Commits}}
- {{ShortSha .Sha1}} {{.Message}}
+ {{ShortSha .Sha1}} {{.Message}}
{{end}}
{{end}}
{{if $push.CompareUrl}}{{$.i18n.Tr "action.compare_2_commits"}} ยป{{end}}