diff --git a/README.md b/README.md index cebb577aa..5e45c5fc9 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ There are 4 ways to install Gogs: ## Contributors -This project was launched by [Unknwon](https://github.com/Unknwon) and [lunny](https://github.com/lunny); [fuxiaohei](https://github.com/fuxiaohei), [slene](https://github.com/slene) and [codeskyblue](https://github.com/codeskyblue) joined the team soon after. See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors. +The [core team](http://gogs.io/team) of this project. See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors. [![Clone in Koding](http://learn.koding.com/btn/clone_d.png)][koding] [koding]: https://koding.com/Teamwork?import=https://github.com/gogits/gogs/archive/master.zip&c=git1 diff --git a/README_ZH.md b/README_ZH.md index d93a4921a..991171446 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -63,7 +63,7 @@ Gogs 完全使用 Go 语言来实现对 Git 数据的操作,实现 **零** 依 ## 贡献成员 -本项目最初由 [Unknown](https://github.com/Unknwon) 和 [lunny](https://github.com/lunny) 发起,随后 [fuxiaohei](https://github.com/fuxiaohei)、[slene](https://github.com/slene) 以及 [codeskyblue](https://github.com/codeskyblue) 加入到开发团队。您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。 +本项目的 [开发团队](http://gogs.io/team)。您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。 [![Clone in Koding](http://learn.koding.com/btn/clone_d.png)][koding] [koding]: https://koding.com/Teamwork?import=https://github.com/gogits/gogs/archive/master.zip&c=git1 diff --git a/modules/mailer/mail.go b/modules/mailer/mail.go index 834f4a898..7516ce7e9 100644 --- a/modules/mailer/mail.go +++ b/modules/mailer/mail.go @@ -8,6 +8,7 @@ import ( "encoding/hex" "errors" "fmt" + "path" "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/base" @@ -135,7 +136,7 @@ func SendIssueNotifyMail(user, owner *models.User, repo *models.Repository, issu return tos, nil } - subject := fmt.Sprintf("[%s] %s", repo.Name, issue.Name) + subject := fmt.Sprintf("[%s] %s(#%d)", repo.Name, issue.Name, issue.Index) content := fmt.Sprintf("%s
-
View it on Gogs.", base.RenderSpecialLink([]byte(issue.Content), owner.Name+"/"+repo.Name), base.AppUrl, owner.Name, repo.Name, issue.Index) @@ -146,17 +147,48 @@ func SendIssueNotifyMail(user, owner *models.User, repo *models.Repository, issu } // SendIssueMentionMail sends mail notification for who are mentioned in issue. -func SendIssueMentionMail(user, owner *models.User, repo *models.Repository, issue *models.Issue, tos []string) error { +func SendIssueMentionMail(r *middleware.Render, user, owner *models.User, + repo *models.Repository, issue *models.Issue, tos []string) error { + if len(tos) == 0 { return nil } - issueLink := fmt.Sprintf("%s%s/%s/issues/%d", base.AppUrl, owner.Name, repo.Name, issue.Index) - body := fmt.Sprintf(`%s mentioned you.`, user.Name) - subject := fmt.Sprintf("[%s] %s", repo.Name, issue.Name) - content := fmt.Sprintf("%s
-
View it on Gogs.", body, issueLink) - msg := NewMailMessageFrom(tos, user.Name, subject, content) + subject := fmt.Sprintf("[%s] %s(#%d)", repo.Name, issue.Name, issue.Index) + + data := GetMailTmplData(nil) + data["IssueLink"] = fmt.Sprintf("%s/%s/issues/%d", owner.Name, repo.Name, issue.Index) + data["Subject"] = subject + + body, err := r.HTMLString("mail/notify/mention", data) + if err != nil { + return fmt.Errorf("mail.SendIssueMentionMail(fail to render): %v", err) + } + + msg := NewMailMessageFrom(tos, user.Name, subject, body) msg.Info = fmt.Sprintf("Subject: %s, send issue mention emails", subject) SendAsync(&msg) return nil } + +// SendCollaboratorMail sends mail notification to new collaborator. +func SendCollaboratorMail(r *middleware.Render, user, owner *models.User, + repo *models.Repository) error { + + subject := fmt.Sprintf("%s added you to %s", owner.Name, repo.Name) + + data := GetMailTmplData(nil) + data["RepoLink"] = path.Join(owner.Name, repo.Name) + data["Subject"] = subject + + body, err := r.HTMLString("mail/notify/collaborator", data) + if err != nil { + return fmt.Errorf("mail.SendCollaboratorMail(fail to render): %v", err) + } + + msg := NewMailMessage([]string{user.Email}, subject, body) + msg.Info = fmt.Sprintf("UID: %d, send register mail", user.Id) + + SendAsync(&msg) + return nil +} diff --git a/routers/repo/issue.go b/routers/repo/issue.go index e761d9a2e..4e2076620 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -132,8 +132,8 @@ func CreateIssuePost(ctx *middleware.Context, params martini.Params, form auth.C newTos = append(newTos, m[1:]) } - if err = mailer.SendIssueMentionMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, - issue, models.GetUserEmailsByNames(newTos)); err != nil { + if err = mailer.SendIssueMentionMail(ctx.Render, ctx.User, ctx.Repo.Owner, + ctx.Repo.Repository, issue, models.GetUserEmailsByNames(newTos)); err != nil { ctx.Handle(500, "issue.CreateIssue(SendIssueMentionMail)", err) return } diff --git a/routers/repo/setting.go b/routers/repo/setting.go index aee3fe3a1..79d5f175d 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -13,6 +13,7 @@ import ( "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/log" + "github.com/gogits/gogs/modules/mailer" "github.com/gogits/gogs/modules/middleware" ) @@ -185,22 +186,30 @@ func CollaborationPost(ctx *middleware.Context) { return } - isExist, err := models.IsUserExist(name) + u, err := models.GetUserByName(name) if err != nil { - ctx.Handle(500, "repo.CollaborationPost(IsUserExist)", err) - return - } else if !isExist { - ctx.Flash.Error("Given user does not exist.") - ctx.Redirect(ctx.Req.RequestURI) + if err == models.ErrUserNotExist { + ctx.Flash.Error("Given user does not exist.") + ctx.Redirect(ctx.Req.RequestURI) + } else { + ctx.Handle(500, "repo.CollaborationPost(GetUserByName)", err) + } return } - if err := models.AddAccess(&models.Access{UserName: name, RepoName: repoLink, + if err = models.AddAccess(&models.Access{UserName: name, RepoName: repoLink, Mode: models.AU_WRITABLE}); err != nil { ctx.Handle(500, "repo.CollaborationPost(AddAccess)", err) return } + if base.Service.NotifyMail { + if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil { + ctx.Handle(500, "repo.CollaborationPost(SendCollaboratorMail)", err) + return + } + } + ctx.Flash.Success("New collaborator has been added.") ctx.Redirect(ctx.Req.RequestURI) } diff --git a/templates/mail/notify/collaborator.tmpl b/templates/mail/notify/collaborator.tmpl new file mode 100644 index 000000000..0664b4c64 --- /dev/null +++ b/templates/mail/notify/collaborator.tmpl @@ -0,0 +1,18 @@ + + + + + {{.Subject}} + + + +

You can now push to this repository.

+

+ --- +
+ View it on Gogs: +
+ {{.AppUrl}}{{.RepoLink}} +

+ + diff --git a/templates/mail/notify/mention.tmpl b/templates/mail/notify/mention.tmpl new file mode 100644 index 000000000..be022d0dd --- /dev/null +++ b/templates/mail/notify/mention.tmpl @@ -0,0 +1,16 @@ + + + + + {{.Subject}} + + + +

{{.ActUserName}} mentioned you.

+

+ --- +
+ View it on Gogs. +

+ +