diff --git a/README.md b/README.md
index cebb577aa1..5e45c5fc95 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 d93a4921a0..9911714462 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 834f4a898a..7516ce7e94 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 e761d9a2e9..4e2076620d 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 aee3fe3a1d..79d5f175da 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 0000000000..0664b4c640
--- /dev/null
+++ b/templates/mail/notify/collaborator.tmpl
@@ -0,0 +1,18 @@
+
+
+
You can now push to this repository.
+
+ ---
+
+ View it on Gogs:
+
+ {{.AppUrl}}{{.RepoLink}}
+
{{.ActUserName}} mentioned you.
+
+ ---
+
+ View it on Gogs.
+