@@ -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 |
@@ -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 |
@@ -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<br>-<br> <a href=\"%s%s/%s/issues/%d\">View it on Gogs</a>.", | |||
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<br>-<br> <a href=\"%s\">View it on Gogs</a>.", 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 | |||
} |
@@ -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 | |||
} |
@@ -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) | |||
} |
@@ -0,0 +1,18 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |||
<title>{{.Subject}}</title> | |||
</head> | |||
<body> | |||
<p>You can now push to this repository.</p> | |||
<p> | |||
--- | |||
<br> | |||
View it on Gogs: | |||
<br> | |||
<a href="{{.AppUrl}}{{.RepoLink}}">{{.AppUrl}}{{.RepoLink}}</a> | |||
</p> | |||
</body> | |||
</html> |
@@ -0,0 +1,16 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |||
<title>{{.Subject}}</title> | |||
</head> | |||
<body> | |||
<p>{{.ActUserName}} mentioned you.</p> | |||
<p> | |||
--- | |||
<br> | |||
<a href="{{.AppUrl}}{{.IssueLink}}">View it on Gogs</a>. | |||
</p> | |||
</body> | |||
</html> |