From 1d57f0d64fcd9aec16b4003d5664f31ea748da03 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 13 Nov 2015 17:10:25 -0500 Subject: [PATCH] Show custom avatars in commits --- README.md | 2 +- cmd/web.go | 6 +-- gogs.go | 2 +- models/action.go | 46 ++++++++++++++++-- models/update.go | 9 ++-- models/user.go | 2 +- modules/base/tool.go | 18 +++++++ modules/{base => template}/template.go | 64 +++++++------------------ routers/repo/view.go | 3 +- templates/.VERSION | 2 +- templates/user/dashboard/dashboard.tmpl | 8 ++-- templates/user/dashboard/feeds.tmpl | 2 +- 12 files changed, 97 insertions(+), 67 deletions(-) rename modules/{base => template}/template.go (81%) 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}}